{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 80,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 读取数据    用户表"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>User-ID</th>\n",
       "      <th>Location</th>\n",
       "      <th>Age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>nyc, new york, usa</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>stockton, california, usa</td>\n",
       "      <td>18.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>moscow, yukon territory, russia</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>porto, v.n.gaia, portugal</td>\n",
       "      <td>17.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>farnborough, hants, united kingdom</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   User-ID                            Location   Age\n",
       "0        1                  nyc, new york, usa   NaN\n",
       "1        2           stockton, california, usa  18.0\n",
       "2        3     moscow, yukon territory, russia   NaN\n",
       "3        4           porto, v.n.gaia, portugal  17.0\n",
       "4        5  farnborough, hants, united kingdom   NaN"
      ]
     },
     "execution_count": 81,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user = pd.read_csv('./data/BX-Users.csv', sep=';')\n",
    "df_user.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 修改列名"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>nyc, new york, usa</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>stockton, california, usa</td>\n",
       "      <td>18.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>moscow, yukon territory, russia</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>porto, v.n.gaia, portugal</td>\n",
       "      <td>17.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>farnborough, hants, united kingdom</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id                            location   age\n",
       "0        1                  nyc, new york, usa   NaN\n",
       "1        2           stockton, california, usa  18.0\n",
       "2        3     moscow, yukon territory, russia   NaN\n",
       "3        4           porto, v.n.gaia, portugal  17.0\n",
       "4        5  farnborough, hants, united kingdom   NaN"
      ]
     },
     "execution_count": 82,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user.columns = ['user_id', 'location', 'age']\n",
    "df_user.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 分析location"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "metadata": {},
   "outputs": [],
   "source": [
    "location_value_counts = df_user['location'].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "london, england, united kingdom       2506\n",
       "toronto, ontario, canada              2250\n",
       "sydney, new south wales, australia    1744\n",
       "melbourne, victoria, australia        1708\n",
       "portland, oregon, usa                 1629\n",
       "                                      ... \n",
       "sligo, pennsylvania, usa                 1\n",
       "shaw, england, united kingdom            1\n",
       "seixal, miratejo, portugal               1\n",
       "pennsbro, west virginia, usa             1\n",
       "sherman oaks, ,                          1\n",
       "Name: location, Length: 57339, dtype: int64"
      ]
     },
     "execution_count": 84,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "location_value_counts"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 平均每个地区，存在的用户个数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "4.863321648441723"
      ]
     },
     "execution_count": 85,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "location_value_counts.sum() / location_value_counts.count()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 把location变成国家"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "metadata": {},
   "outputs": [],
   "source": [
    "df_user['location'] = df_user['location'].apply(lambda location:location.rsplit(',', maxsplit = 1)[-1].strip())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>usa</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>usa</td>\n",
       "      <td>18.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>russia</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>portugal</td>\n",
       "      <td>17.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>united kingdom</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id        location   age\n",
       "0        1             usa   NaN\n",
       "1        2             usa  18.0\n",
       "2        3          russia   NaN\n",
       "3        4        portugal  17.0\n",
       "4        5  united kingdom   NaN"
      ]
     },
     "execution_count": 87,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "709"
      ]
     },
     "execution_count": 88,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(df_user['location'].unique())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 89,
   "metadata": {},
   "outputs": [],
   "source": [
    "location_value_counts = df_user['location'].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 90,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYoAAAD4CAYAAADy46FuAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAbQ0lEQVR4nO3dfYxd9Z3f8feHMR5sg40fBtadcXacxc0uWGmAkWNKlaXrDXbSCPMHSIOaxW1dWYvoNumDUtxIS5vIatiuwpaqWLJiB8OmGK83u7jRssQyi6JWxGZ4ijHG69kS7MEGz66NcTF+GPvbP85vzDnnnrlj5s7DNf68pKt77/ec37nfGzl85vc7596riMDMzGwol010A2Zm1twcFGZmVpeDwszM6nJQmJlZXQ4KMzOra9JENzDa5syZE52dnRPdhpnZReWll17624hoq9r2qQuKzs5Oenp6JroNM7OLiqS3h9rmpSczM6vLQWFmZnU5KMzMrC4HhZmZ1eWgMDOzuoYNCkkbJB2W9HrFtn8vKSTNydVWS+qVtFfS0lz9Zkm70rZHJCnVWyU9leo7JHXmxqyQtC/dVjT6Zs3M7JO7kBnFY8CyclHSPODLwP5c7XqgG7ghjXlUUkvavBZYBSxIt8FjrgSORsR1wMPAQ+lYs4AHgS8Ci4AHJc38ZG/PzMwaNWxQRMTPgCMVmx4GvgXkv6d8ObApIk5FxFtAL7BI0lxgekS8ENn3mj8O3JkbszE93gIsSbONpcC2iDgSEUeBbVQE1mg5cXqA7/90L6/sPzpWL2FmdlEa0TkKSXcA70TEa6VN7cCB3PO+VGtPj8v1wpiIGACOAbPrHKuqn1WSeiT19Pf3j+Qt8dHpszzyXC+73jk2ovFmZp9WnzgoJE0Fvg38ftXmilrUqY90TLEYsS4iuiKiq62t8hPoF8y/42RmVjSSGcWvAfOB1yT9EugAXpb0K2R/9c/L7dsBHEz1joo6+TGSJgEzyJa6hjrWmEjn1vEv/pmZFX3ioIiIXRFxTUR0RkQn2X/Qb4qId4GtQHe6kmk+2UnrnRFxCDguaXE6/3Av8HQ65FZg8Iqmu4Dn0nmMZ4HbJc1MJ7FvT7UxUTV9MTOzC/hSQElPArcBcyT1AQ9GxPqqfSNit6TNwBvAAHB/RJxNm+8ju4JqCvBMugGsB56Q1Es2k+hOxzoi6bvAi2m/70RE1Un1UeX5hJlZ0bBBERH3DLO9s/R8DbCmYr8eYGFF/SRw9xDH3gBsGK7H0ZBWnnyOwsysxJ/MTuTFJzOzSg6KEk8ozMyKHBSDzi89OSrMzPIcFIm88mRmVslBYWZmdTkoksEJhVeezMyKHBSJvPZkZlbJQVESvu7JzKzAQZF46cnMrJqDIvHKk5lZNQdFiScUZmZFDopk8Cs8vPRkZlbkoEi89GRmVs1BUeKrnszMihwUJV56MjMrclAkXnoyM6vmoDAzs7ocFMnHVz157cnMLM9BkXjpycys2rBBIWmDpMOSXs/V/qukNyX9QtKfSbo6t221pF5JeyUtzdVvlrQrbXtE6Vv4JLVKeirVd0jqzI1ZIWlfuq0YrTddjycUZmZFFzKjeAxYVqptAxZGxOeBvwZWA0i6HugGbkhjHpXUksasBVYBC9Jt8JgrgaMRcR3wMPBQOtYs4EHgi8Ai4EFJMz/5W7ww57/raaxewMzsIjVsUETEz4AjpdpPI2IgPf050JEeLwc2RcSpiHgL6AUWSZoLTI+IFyI7CfA4cGduzMb0eAuwJM02lgLbIuJIRBwlC6dyYI0af824mVm10ThH8S+AZ9LjduBAbltfqrWnx+V6YUwKn2PA7DrHqiFplaQeST39/f0NvRkvPZmZFTUUFJK+DQwAPxosVewWdeojHVMsRqyLiK6I6Gpra6vf9BA+XnpyUpiZ5Y04KNLJ5a8B/zQ+vqa0D5iX260DOJjqHRX1whhJk4AZZEtdQx3LzMzG0YiCQtIy4D8Ad0TEidymrUB3upJpPtlJ650RcQg4LmlxOv9wL/B0bszgFU13Ac+l4HkWuF3SzHQS+/ZUGxODpyi89GRmVjRpuB0kPQncBsyR1Ed2JdJqoBXYlk4C/zwifjcidkvaDLxBtiR1f0ScTYe6j+wKqilk5zQGz2usB56Q1Es2k+gGiIgjkr4LvJj2+05EFE6qjyafzDYzqzZsUETEPRXl9XX2XwOsqaj3AAsr6ieBu4c41gZgw3A9jiZPKMzMivzJ7DKvPZmZFTgocrz6ZGZWy0FR4vmEmVmRgyJHeOXJzKzMQZHjK5/MzGo5KEr8yWwzsyIHRY6XnszMajkocrzyZGZWy0FR4gmFmVmRgyJHyEtPZmYlDoo8Lz2ZmdVwUJT4qiczsyIHRY7AJynMzEocFDm+6snMrJaDosQTCjOzIgdFTnbVk6PCzCzPQZHjpSczs1oOihJPKMzMihwUOcLnKMzMyoYNCkkbJB2W9HquNkvSNkn70v3M3LbVknol7ZW0NFe/WdKutO0Rpe/0ltQq6alU3yGpMzdmRXqNfZJWjNabrvNex/olzMwuOhcyo3gMWFaqPQBsj4gFwPb0HEnXA93ADWnMo5Ja0pi1wCpgQboNHnMlcDQirgMeBh5Kx5oFPAh8EVgEPJgPpLHipSczs6JhgyIifgYcKZWXAxvT443Anbn6pog4FRFvAb3AIklzgekR8UJklxU9XhozeKwtwJI021gKbIuIIxFxFNhGbWCNqmzpyUlhZpY30nMU10bEIYB0f02qtwMHcvv1pVp7elyuF8ZExABwDJhd51g1JK2S1COpp7+/f4RvCX/Xk5lZhdE+mV31n9qoUx/pmGIxYl1EdEVEV1tb2wU1OhQvPZmZFY00KN5Ly0mk+8Op3gfMy+3XARxM9Y6KemGMpEnADLKlrqGONWY8oTAzqzXSoNgKDF6FtAJ4OlfvTlcyzSc7ab0zLU8dl7Q4nX+4tzRm8Fh3Ac+l8xjPArdLmplOYt+eamPGVz2ZmdWaNNwOkp4EbgPmSOojuxLpe8BmSSuB/cDdABGxW9Jm4A1gALg/Is6mQ91HdgXVFOCZdANYDzwhqZdsJtGdjnVE0neBF9N+34mI8kn1Ueev8DAzKxo2KCLiniE2LRli/zXAmop6D7Cwon6SFDQV2zYAG4brcbR4QmFmVsufzC7xfMLMrMhBkSN81ZOZWZmDIscns83MajkoSvzJbDOzIgdFjpeezMxqOShyvPJkZlbLQVHiCYWZWZGDokBeejIzK3FQ5HjpycysloOihqcUZmZ5DoocX/VkZlbLQZHjpSczs1oOihLPKMzMihwUOUL+ZLaZWYmDIsdLT2ZmtRwUJV56MjMrclDkCF8ca2ZW5qDI8deMm5nVclCUeOnJzKzIQVHiq57MzIoaCgpJ/0bSbkmvS3pS0hWSZknaJmlfup+Z23+1pF5JeyUtzdVvlrQrbXtEaQ1IUqukp1J9h6TORvod/v2M5dHNzC5OIw4KSe3Avwa6ImIh0AJ0Aw8A2yNiAbA9PUfS9Wn7DcAy4FFJLelwa4FVwIJ0W5bqK4GjEXEd8DDw0Ej7vWCeUJiZFTS69DQJmCJpEjAVOAgsBzam7RuBO9Pj5cCmiDgVEW8BvcAiSXOB6RHxQkQE8HhpzOCxtgBLNIZnnCXnhJlZ2YiDIiLeAf4Q2A8cAo5FxE+BayPiUNrnEHBNGtIOHMgdoi/V2tPjcr0wJiIGgGPA7HIvklZJ6pHU09/fP9K3hPDak5lZWSNLTzPJ/uKfD/w9YJqkr9cbUlGLOvV6Y4qFiHUR0RURXW1tbfUbH0b4siczs4JGlp5+G3grIvoj4gzwY+AfAu+l5STS/eG0fx8wLze+g2ypqi89LtcLY9Ly1gzgSAM91+WlJzOzWo0ExX5gsaSp6bzBEmAPsBVYkfZZATydHm8FutOVTPPJTlrvTMtTxyUtTse5tzRm8Fh3Ac/FGP7J74UnM7Nak0Y6MCJ2SNoCvAwMAK8A64Argc2SVpKFyd1p/92SNgNvpP3vj4iz6XD3AY8BU4Bn0g1gPfCEpF6ymUT3SPu98Pc11q9gZnZxGXFQAETEg8CDpfIpstlF1f5rgDUV9R5gYUX9JCloxoMkLz2ZmZX4k9lmZlaXgyIn+81szynMzPIcFHk+m21mVsNBUeL5hJlZkYMiR+CkMDMrcVDk+IeLzMxqOShK/HsUZmZFDoqc7Kqnie7CzKy5OChyvPJkZlbLQVHiGYWZWZGDIkfI5yjMzEocFDleejIzq+WgKPHSk5lZkYOixDlhZlbkoMjxB+7MzGo5KEq89GRmVuSgyMnmE04KM7M8B0WOV57MzGo5KEq89GRmVtRQUEi6WtIWSW9K2iPpFkmzJG2TtC/dz8ztv1pSr6S9kpbm6jdL2pW2PaJ0VllSq6SnUn2HpM5G+h3+/XjhycysrNEZxX8D/jIifh34B8Ae4AFge0QsALan50i6HugGbgCWAY9KaknHWQusAhak27JUXwkcjYjrgIeBhxrsty75J+7MzGqMOCgkTQe+BKwHiIjTEfE+sBzYmHbbCNyZHi8HNkXEqYh4C+gFFkmaC0yPiBci+8Hqx0tjBo+1BViiMb6G1b+ZbWZW1MiM4rNAP/BDSa9I+oGkacC1EXEIIN1fk/ZvBw7kxvelWnt6XK4XxkTEAHAMmF1uRNIqST2Sevr7+0f8hrz0ZGZWq5GgmATcBKyNiBuBD0nLTEOomglEnXq9McVCxLqI6IqIrra2tvpdf8IGzcwudY0ERR/QFxE70vMtZMHxXlpOIt0fzu0/Lze+AziY6h0V9cIYSZOAGcCRBnoelleezMyKRhwUEfEucEDS51JpCfAGsBVYkWorgKfT461Ad7qSaT7ZSeudaXnquKTF6fzDvaUxg8e6C3guxvIkguSlJzOzkkkNjv894EeSJgP/F/jnZOGzWdJKYD9wN0BE7Ja0mSxMBoD7I+JsOs59wGPAFOCZdIPsRPkTknrJZhLdDfZbl5eezMxqNRQUEfEq0FWxackQ+68B1lTUe4CFFfWTpKAZL77qycysyJ/MzvFXeJiZ1XJQ5DgnzMxqOShKvPJkZlbkoMjxDxeZmdVyUJSEL5A1MytwUOQILz2ZmZU5KHK88mRmVstBUeIZhZlZkYMiR8jnKMzMShwUeV56MjOr4aAo8dKTmVmRgyJH+IeLzMzKHBQ5vurJzKyWg6LMUwozswIHRY6vejIzq+WgyPHSk5lZLQdFia96MjMrclDkSD5FYWZW5qDIkT9xZ2ZWo+GgkNQi6RVJP0nPZ0naJmlfup+Z23e1pF5JeyUtzdVvlrQrbXtE6YchJLVKeirVd0jqbLTf4fg3s83MikZjRvENYE/u+QPA9ohYAGxPz5F0PdAN3AAsAx6V1JLGrAVWAQvSbVmqrwSORsR1wMPAQ6PQ75C89GRmVquhoJDUAfwT4Ae58nJgY3q8EbgzV98UEaci4i2gF1gkaS4wPSJeiOzP+cdLYwaPtQVYIv8MnZnZuGp0RvFHwLeAc7natRFxCCDdX5Pq7cCB3H59qdaeHpfrhTERMQAcA2aXm5C0SlKPpJ7+/v6G3pBXnszMikYcFJK+BhyOiJcudEhFLerU640pFiLWRURXRHS1tbVdYDsVDUpeejIzK5nUwNhbgTskfRW4Apgu6Y+B9yTNjYhDaVnpcNq/D5iXG98BHEz1jop6fkyfpEnADOBIAz3X5TUtM7NaI55RRMTqiOiIiE6yk9TPRcTXga3AirTbCuDp9Hgr0J2uZJpPdtJ6Z1qeOi5pcTr/cG9pzOCx7kqvMbZ/9HvtycysoJEZxVC+B2yWtBLYD9wNEBG7JW0G3gAGgPsj4mwacx/wGDAFeCbdANYDT0jqJZtJdI9Bv+f5qiczs1qjEhQR8TzwfHr8d8CSIfZbA6ypqPcACyvqJ0lBMx689GRmVsufzC7xypOZWZGDIie76slJYWaW56DI8dKTmVktB0WJl57MzIocFDmSg8LMrMxBYWZmdTkoCvwVHmZmZQ6KHH8vrZlZLQdFiX+4yMysyEGR4wmFmVktB0WOl57MzGo5KEq88mRmVuSgyBH+Cg8zszIHRY6XnszMajkoSrz0ZGZW5KDI8Q8XmZnVclDkyBfImpnVcFCU+AN3ZmZFDoo8Lz2ZmdUYcVBImifpryTtkbRb0jdSfZakbZL2pfuZuTGrJfVK2itpaa5+s6RdadsjUnb9kaRWSU+l+g5JnSN/qxfwnsby4GZmF6lGZhQDwL+LiN8AFgP3S7oeeADYHhELgO3pOWlbN3ADsAx4VFJLOtZaYBWwIN2WpfpK4GhEXAc8DDzUQL/DmtxyGafOnBvLlzAzu+iMOCgi4lBEvJweHwf2AO3AcmBj2m0jcGd6vBzYFBGnIuItoBdYJGkuMD0iXojsBMHjpTGDx9oCLBmcbYyFtqta6f9/p3yewswsZ1TOUaQloRuBHcC1EXEIsjABrkm7tQMHcsP6Uq09PS7XC2MiYgA4BswejZ6rtF3VyumBc3zw0cBYvYSZ2UWn4aCQdCXwp8A3I+KDertW1KJOvd6Ycg+rJPVI6unv7x+u5SFdM/0KAA4fPzniY5iZfdo0FBSSLicLiR9FxI9T+b20nES6P5zqfcC83PAO4GCqd1TUC2MkTQJmAEfKfUTEuojoioiutra2Eb+fa69qBeDQMQeFmdmgRq56ErAe2BMR389t2gqsSI9XAE/n6t3pSqb5ZCetd6blqeOSFqdj3lsaM3isu4DnYgxPICy49ioA3ny33sTIzOzSMqmBsbcCvwPskvRqqv1H4HvAZkkrgf3A3QARsVvSZuANsium7o+Is2ncfcBjwBTgmXSDLIiekNRLNpPobqDfYc2aNpmOmVP4Rd+xsXwZM7OLyoiDIiL+N0N/9GDJEGPWAGsq6j3Awor6SVLQjJd5M6fyrpeezMzO8yezS2ZNm8yRE6cnug0zs6bhoCiZOe1yjn7ooDAzG+SgKJk1dTLHPjrD2XP+0J2ZGTgoasycNplzAR98dGaiWzEzawoOipJr04fuDhw9McGdmJk1BwdFyec7ZgDwyv73J7gTM7Pm4KAoab96CvPnTGPTiweG39nM7BLgoCiRxJ1faGfPoQ84PeCvHDczc1BUuOqK7HOIH50+O8yeZmaffg6KClMnZ7+ndOKMv27czMxBUWFqazaj+PCUZxRmZg6KClMvTzOK055RmJk5KCpMbR0MCs8ozMwcFBWmTc6WnjyjMDNzUFQ6fzLbMwozMwdFlcGT2Sd8MtvMzEFRZXr6HMV7H/gHjMzMHBQVrrricn79V65i04sHOHDEXw5oZpc2B8UQfvc3f43Dx0/yj//wed55/6OJbsfMbMI4KIZw543trPudLgbOBU+/+s5Et2NmNmEuiqCQtEzSXkm9kh4Yr9f9zb/fxpwrW/mDv9zLP/vhTp74+du8/s4xTp7xSW4zu3RMmugGhiOpBfgfwJeBPuBFSVsj4o2xfu3LLhP/6/du5YkX3ubHL7/D83v7U08wc+pkbvtcG59vn8GsK1u5srWFKZdPYsrkFqZc3sIVl1+W3U9uYXLLx3ksgdD5x0B6ln1zbfF5sW5mNhEU0dy/DS3pFuA/RcTS9Hw1QET8l6r9u7q6oqenZ9T7OHsu2H/kBC+/fZT9R06w993jbNvz3rj/tvYFhws6X6zcNsSxzkfSUK9TZ4xKg2v3/fj1h3ofNe/zAsYM17PZpeI35k7nv99z44jGSnopIrqqtjX9jAJoB/K/ItQHfDG/g6RVwCqAz3zmM2PSRMtlYv6cacyfM+187ey54P0Tpzny4Wk+PH2WE6cGODlwlo9On+PkmbN8dOYsJ8+c5fTZ7Hct8pk8GNCDtThfH3z+8faguLHevoPby9uoeZ3hx5T/hoiK16967eLY0vYLGFPVc9VrV76f4suaXVLmzZwyJse9GIKi6s/Cwn8GImIdsA6yGcV4NAVZeMy+spXZV7aO10uamY27i+Fkdh8wL/e8Azg4Qb2YmV1yLoageBFYIGm+pMlAN7B1gnsyM7tkNP3SU0QMSPpXwLNAC7AhInZPcFtmZpeMpg8KgIj4C+AvJroPM7NL0cWw9GRmZhPIQWFmZnU5KMzMrC4HhZmZ1dX0X+HxSUnqB95u4BBzgL8dpXbGmnsdG+51bLjXsTFavf5qRLRVbfjUBUWjJPUM9X0nzca9jg33Ojbc69gYj1699GRmZnU5KMzMrC4HRa11E93AJ+Bex4Z7HRvudWyMea8+R2FmZnV5RmFmZnU5KMzMrC4HRSJpmaS9knolPdAE/WyQdFjS67naLEnbJO1L9zNz21an3vdKWjrOvc6T9FeS9kjaLekbzdqvpCsk7ZT0Wur1Pzdrr7nXb5H0iqSfNHOvkn4paZekVyX1NHmvV0vaIunN9O/2lmbsVdLn0v+eg7cPJH1z3HuNiEv+Rvb15X8DfBaYDLwGXD/BPX0JuAl4PVf7A+CB9PgB4KH0+PrUcyswP72XlnHsdS5wU3p8FfDXqaem65fsFxOvTI8vB3YAi5ux11zP/xb4n8BPmvzfwS+BOaVas/a6EfiX6fFk4Opm7TXXcwvwLvCr493ruL7RZr0BtwDP5p6vBlY3QV+dFINiLzA3PZ4L7K3ql+y3O26ZwL6fBr7c7P0CU4GXyX6DvSl7JftFx+3Ab+WColl7rQqKpusVmA68RbqYp5l7LfV3O/B/JqJXLz1l2oEDued9qdZsro2IQwDp/ppUb5r+JXUCN5L9pd6U/aalnFeBw8C2iGjaXoE/Ar4FnMvVmrXXAH4q6SVJq1KtGXv9LNAP/DAt6f1A0rQm7TWvG3gyPR7XXh0UGVXULqbrhpuif0lXAn8KfDMiPqi3a0Vt3PqNiLMR8QWyv9YXSVpYZ/cJ61XS14DDEfHShQ6pqI3nv4NbI+Im4CvA/ZK+VGffiex1Etmy7tqIuBH4kGz5ZigT/b8r6Weg7wD+ZLhdK2oN9+qgyPQB83LPO4CDE9RLPe9JmguQ7g+n+oT3L+lyspD4UUT8OJWbtl+AiHgfeB5YRnP2eitwh6RfApuA35L0x03aKxFxMN0fBv4MWNSkvfYBfWkmCbCFLDiasddBXwFejoj30vNx7dVBkXkRWCBpfkrubmDrBPdUZSuwIj1eQXYuYLDeLalV0nxgAbBzvJqSJGA9sCcivt/M/Upqk3R1ejwF+G3gzWbsNSJWR0RHRHSS/Zt8LiK+3oy9Spom6arBx2Tr6a83Y68R8S5wQNLnUmkJ8EYz9ppzDx8vOw32NH69jvcJmWa9AV8lu1rnb4BvN0E/TwKHgDNkfyWsBGaTndjcl+5n5fb/dup9L/CVce71H5FNb38BvJpuX23GfoHPA6+kXl8Hfj/Vm67XUt+38fHJ7KbrlWzd/7V02z34/6Fm7DW99heAnvTv4M+BmU3c61Tg74AZudq49uqv8DAzs7q89GRmZnU5KMzMrC4HhZmZ1eWgMDOzuhwUZmZWl4PCzMzqclCYmVld/x9tB8qx8/CvFgAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(\n",
    "    range(len(location_value_counts)),\n",
    "    location_value_counts,\n",
    ")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 91,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.pie(\n",
    "    location_value_counts,\n",
    "    labels = location_value_counts.index,\n",
    ")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 分析 年龄"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 92,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>usa</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>russia</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>united kingdom</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>6</th>\n",
       "      <td>7</td>\n",
       "      <td>usa</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>NaN</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id        location  age\n",
       "0        1             usa  NaN\n",
       "2        3          russia  NaN\n",
       "4        5  united kingdom  NaN\n",
       "6        7             usa  NaN\n",
       "7        8          canada  NaN"
      ]
     },
     "execution_count": 92,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user[df_user['age'].isnull()].head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 93,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>usa</td>\n",
       "      <td>18.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>portugal</td>\n",
       "      <td>17.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>6</td>\n",
       "      <td>usa</td>\n",
       "      <td>61.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>9</th>\n",
       "      <td>10</td>\n",
       "      <td>spain</td>\n",
       "      <td>26.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>10</th>\n",
       "      <td>11</td>\n",
       "      <td>australia</td>\n",
       "      <td>14.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    user_id   location   age\n",
       "1         2        usa  18.0\n",
       "3         4   portugal  17.0\n",
       "5         6        usa  61.0\n",
       "9        10      spain  26.0\n",
       "10       11  australia  14.0"
      ]
     },
     "execution_count": 93,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user_age_notnull = df_user[~df_user['age'].isnull()]\n",
    "df_user_age_notnull.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 94,
   "metadata": {},
   "outputs": [],
   "source": [
    "age_value_counts_sort_by_age = df_user_age_notnull['age'].value_counts().sort_index()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 95,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(\n",
    "    age_value_counts_sort_by_age.index,\n",
    "    age_value_counts_sort_by_age\n",
    ")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 96,
   "metadata": {},
   "outputs": [],
   "source": [
    "def divide_age(age):\n",
    "    \"\"\"\n",
    "    :return:\n",
    "        Nan,0-6,>100  --> 0 年龄填写有误\n",
    "        7 - 12        --> 1 少儿\n",
    "        13 - 17       --> 2 青少年\n",
    "        18 - 45       --> 3 青年\n",
    "        46 - 69       --> 4 中年\n",
    "        70 - 100      --> 5 老年\n",
    "    \"\"\"\n",
    "    if np.isnan(age) or (age <= 6) or (age > 100):\n",
    "        return 0\n",
    "    if age >= 7 and age <= 12:\n",
    "        return 1\n",
    "    if age >= 13 and age <= 17:\n",
    "        return 2\n",
    "    if age >= 18 and age <= 45:\n",
    "        return 3\n",
    "    if age >= 46 and age <= 69:\n",
    "        return 4\n",
    "    if age >= 70 and age <= 100:\n",
    "        return 5\n",
    "df_user['age'] = df_user['age'].apply(divide_age)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 97,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>usa</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>russia</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>portugal</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>united kingdom</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id        location  age\n",
       "0        1             usa    0\n",
       "1        2             usa    3\n",
       "2        3          russia    0\n",
       "3        4        portugal    2\n",
       "4        5  united kingdom    0"
      ]
     },
     "execution_count": 97,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 分析年龄段"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 98,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.pie(\n",
    "    df_user['age'].value_counts().sort_index(),\n",
    "    labels = ['undefined','shaoer','qingshaonian','qingnian','zhongnian','laonian']\n",
    ")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 读取数据  打分表"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 99,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>User-ID</th>\n",
       "      <th>ISBN</th>\n",
       "      <th>Book-Rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>276725</td>\n",
       "      <td>034545104X</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>276726</td>\n",
       "      <td>0155061224</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>276727</td>\n",
       "      <td>0446520802</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>276729</td>\n",
       "      <td>052165615X</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>276729</td>\n",
       "      <td>0521795028</td>\n",
       "      <td>6.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   User-ID        ISBN  Book-Rating\n",
       "0   276725  034545104X          0.0\n",
       "1   276726  0155061224          5.0\n",
       "2   276727  0446520802          0.0\n",
       "3   276729  052165615X          3.0\n",
       "4   276729  0521795028          6.0"
      ]
     },
     "execution_count": 99,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_rating = pd.read_csv('./data/BX-Book-Ratings.csv',sep=';')\n",
    "df_rating.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 100,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>item_id</th>\n",
       "      <th>rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>276725</td>\n",
       "      <td>034545104X</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>276726</td>\n",
       "      <td>0155061224</td>\n",
       "      <td>5.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>276727</td>\n",
       "      <td>0446520802</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>276729</td>\n",
       "      <td>052165615X</td>\n",
       "      <td>3.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>276729</td>\n",
       "      <td>0521795028</td>\n",
       "      <td>6.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id     item_id  rating\n",
       "0   276725  034545104X     0.0\n",
       "1   276726  0155061224     5.0\n",
       "2   276727  0446520802     0.0\n",
       "3   276729  052165615X     3.0\n",
       "4   276729  0521795028     6.0"
      ]
     },
     "execution_count": 100,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_rating.columns = ['user_id','item_id','rating']\n",
    "df_rating.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 101,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 1149780 entries, 0 to 1149779\n",
      "Data columns (total 3 columns):\n",
      " #   Column   Non-Null Count    Dtype  \n",
      "---  ------   --------------    -----  \n",
      " 0   user_id  1149780 non-null  int64  \n",
      " 1   item_id  1149780 non-null  object \n",
      " 2   rating   1149772 non-null  float64\n",
      "dtypes: float64(1), int64(1), object(1)\n",
      "memory usage: 26.3+ MB\n"
     ]
    }
   ],
   "source": [
    "df_rating.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 删除有误数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 102,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Int64Index: 1149772 entries, 0 to 1149779\n",
      "Data columns (total 3 columns):\n",
      " #   Column   Non-Null Count    Dtype  \n",
      "---  ------   --------------    -----  \n",
      " 0   user_id  1149772 non-null  int64  \n",
      " 1   item_id  1149772 non-null  object \n",
      " 2   rating   1149772 non-null  float64\n",
      "dtypes: float64(1), int64(1), object(1)\n",
      "memory usage: 35.1+ MB\n"
     ]
    }
   ],
   "source": [
    "df_rating = df_rating.dropna()\n",
    "df_rating.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 用户活跃度"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 103,
   "metadata": {},
   "outputs": [],
   "source": [
    "user_value_counts = df_rating['user_id'].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 104,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(\n",
    "    range(len(user_value_counts)),\n",
    "    user_value_counts,\n",
    ")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 商品流行度分析"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 105,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "item_value_counts = df_rating['item_id'].value_counts()\n",
    "plt.plot(\n",
    "    range(len(item_value_counts)),\n",
    "    item_value_counts,\n",
    ")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 106,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Int64Index: 1149772 entries, 0 to 1149779\n",
      "Data columns (total 3 columns):\n",
      " #   Column   Non-Null Count    Dtype \n",
      "---  ------   --------------    ----- \n",
      " 0   user_id  1149772 non-null  int64 \n",
      " 1   item_id  1149772 non-null  object\n",
      " 2   rating   1149772 non-null  int32 \n",
      "dtypes: int32(1), int64(1), object(1)\n",
      "memory usage: 30.7+ MB\n"
     ]
    }
   ],
   "source": [
    "df_rating['rating'] = df_rating['rating'].astype(int)\n",
    "df_rating.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 合并用户表与打分表"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 107,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>usa</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>russia</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>portugal</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>united kingdom</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id        location  age\n",
       "0        1             usa    0\n",
       "1        2             usa    3\n",
       "2        3          russia    0\n",
       "3        4        portugal    2\n",
       "4        5  united kingdom    0"
      ]
     },
     "execution_count": 107,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_user.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 108,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>item_id</th>\n",
       "      <th>rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>276725</td>\n",
       "      <td>034545104X</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>276726</td>\n",
       "      <td>0155061224</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>276727</td>\n",
       "      <td>0446520802</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>276729</td>\n",
       "      <td>052165615X</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>276729</td>\n",
       "      <td>0521795028</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id     item_id  rating\n",
       "0   276725  034545104X       0\n",
       "1   276726  0155061224       5\n",
       "2   276727  0446520802       0\n",
       "3   276729  052165615X       3\n",
       "4   276729  0521795028       6"
      ]
     },
     "execution_count": 108,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_rating.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 109,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "      <th>item_id</th>\n",
       "      <th>rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2</td>\n",
       "      <td>usa</td>\n",
       "      <td>3</td>\n",
       "      <td>0195153448</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>7</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "      <td>034542252</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0002005018</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0060973129</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0374157065</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id location  age     item_id  rating\n",
       "0        2      usa    3  0195153448       0\n",
       "1        7      usa    0   034542252       0\n",
       "2        8   canada    0  0002005018       5\n",
       "3        8   canada    0  0060973129       0\n",
       "4        8   canada    0  0374157065       0"
      ]
     },
     "execution_count": 109,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_data = pd.merge(\n",
    "    df_user,\n",
    "    df_rating,\n",
    "    on='user_id',\n",
    "    how='inner',\n",
    ")\n",
    "df_data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 110,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "Int64Index: 1149772 entries, 0 to 1149771\n",
      "Data columns (total 5 columns):\n",
      " #   Column    Non-Null Count    Dtype \n",
      "---  ------    --------------    ----- \n",
      " 0   user_id   1149772 non-null  int64 \n",
      " 1   location  1149772 non-null  object\n",
      " 2   age       1149772 non-null  int32 \n",
      " 3   item_id   1149772 non-null  object\n",
      " 4   rating    1149772 non-null  int32 \n",
      "dtypes: int32(2), int64(1), object(2)\n",
      "memory usage: 43.9+ MB\n"
     ]
    }
   ],
   "source": [
    "df_data['age'] = df_data['age'].astype(int)\n",
    "df_data.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 保存表"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 111,
   "metadata": {},
   "outputs": [],
   "source": [
    "import _pickle as cPickle"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 112,
   "metadata": {},
   "outputs": [],
   "source": [
    "cPickle.dump(\n",
    "    df_data,\n",
    "    open('./data/df_data.pkl', 'wb')\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 读取文件"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 113,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "      <th>item_id</th>\n",
       "      <th>rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2</td>\n",
       "      <td>usa</td>\n",
       "      <td>3</td>\n",
       "      <td>0195153448</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>7</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "      <td>034542252</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0002005018</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0060973129</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0374157065</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id location  age     item_id  rating\n",
       "0        2      usa    3  0195153448       0\n",
       "1        7      usa    0   034542252       0\n",
       "2        8   canada    0  0002005018       5\n",
       "3        8   canada    0  0060973129       0\n",
       "4        8   canada    0  0374157065       0"
      ]
     },
     "execution_count": 113,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_data = cPickle.load(\n",
    "    open('./data/df_data.pkl', 'rb')\n",
    ")\n",
    "df_data.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 划分数据集 70%训练集 30%测试集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 114,
   "metadata": {},
   "outputs": [],
   "source": [
    "import random"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 115,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[109814,\n",
       " 561359,\n",
       " 182843,\n",
       " 854047,\n",
       " 559003,\n",
       " 225863,\n",
       " 80014,\n",
       " 795081,\n",
       " 1124497,\n",
       " 696669,\n",
       " 714705,\n",
       " 108845,\n",
       " 334836,\n",
       " 283236,\n",
       " 707194,\n",
       " 700021,\n",
       " 514144,\n",
       " 343464,\n",
       " 3503,\n",
       " 914936,\n",
       " 183738,\n",
       " 791873,\n",
       " 146542,\n",
       " 13830,\n",
       " 661565,\n",
       " 940198,\n",
       " 213986,\n",
       " 92038,\n",
       " 194541,\n",
       " 298162,\n",
       " 264764,\n",
       " 44535,\n",
       " 611952,\n",
       " 903112,\n",
       " 1000180,\n",
       " 556419,\n",
       " 984178,\n",
       " 77056,\n",
       " 639835,\n",
       " 720292,\n",
       " 1094021,\n",
       " 1012843,\n",
       " 433822,\n",
       " 1105356,\n",
       " 661154,\n",
       " 26315,\n",
       " 835165,\n",
       " 1075319,\n",
       " 910974,\n",
       " 1129357,\n",
       " 1019502,\n",
       " 1091796,\n",
       " 879747,\n",
       " 785428,\n",
       " 1069686,\n",
       " 66776,\n",
       " 380559,\n",
       " 173245,\n",
       " 1021114,\n",
       " 549217,\n",
       " 356781,\n",
       " 702337,\n",
       " 706564,\n",
       " 820391,\n",
       " 153701,\n",
       " 957909,\n",
       " 812972,\n",
       " 704865,\n",
       " 34200,\n",
       " 396491,\n",
       " 184879,\n",
       " 762346,\n",
       " 26904,\n",
       " 738016,\n",
       " 480519,\n",
       " 850854,\n",
       " 1115679,\n",
       " 1050689,\n",
       " 125255,\n",
       " 603355,\n",
       " 1037627,\n",
       " 489419,\n",
       " 1141207,\n",
       " 1014626,\n",
       " 372432,\n",
       " 322461,\n",
       " 1124870,\n",
       " 932183,\n",
       " 793961,\n",
       " 967407,\n",
       " 92547,\n",
       " 21290,\n",
       " 282544,\n",
       " 957015,\n",
       " 405121,\n",
       " 44058,\n",
       " 537630,\n",
       " 738297,\n",
       " 570278,\n",
       " 910727,\n",
       " 881553,\n",
       " 745,\n",
       " 227794,\n",
       " 131300,\n",
       " 1070219,\n",
       " 744617,\n",
       " 186203,\n",
       " 173865,\n",
       " 908486,\n",
       " 17954,\n",
       " 1123656,\n",
       " 791588,\n",
       " 154107,\n",
       " 1146267,\n",
       " 847684,\n",
       " 61104,\n",
       " 676243,\n",
       " 550586,\n",
       " 990926,\n",
       " 69271,\n",
       " 702190,\n",
       " 868371,\n",
       " 730578,\n",
       " 49895,\n",
       " 343636,\n",
       " 878786,\n",
       " 134734,\n",
       " 301956,\n",
       " 780370,\n",
       " 492754,\n",
       " 164367,\n",
       " 119871,\n",
       " 1087784,\n",
       " 812035,\n",
       " 1127295,\n",
       " 642071,\n",
       " 306476,\n",
       " 610679,\n",
       " 816335,\n",
       " 772775,\n",
       " 265226,\n",
       " 1121809,\n",
       " 708259,\n",
       " 1084444,\n",
       " 250748,\n",
       " 349808,\n",
       " 810016,\n",
       " 906351,\n",
       " 130140,\n",
       " 285245,\n",
       " 953660,\n",
       " 43227,\n",
       " 733037,\n",
       " 943139,\n",
       " 946127,\n",
       " 637126,\n",
       " 899696,\n",
       " 59261,\n",
       " 332560,\n",
       " 1093855,\n",
       " 681273,\n",
       " 1083897,\n",
       " 1079444,\n",
       " 288088,\n",
       " 720520,\n",
       " 1048832,\n",
       " 219734,\n",
       " 1143907,\n",
       " 773850,\n",
       " 471658,\n",
       " 713201,\n",
       " 194735,\n",
       " 569903,\n",
       " 1061791,\n",
       " 510109,\n",
       " 426292,\n",
       " 675402,\n",
       " 554798,\n",
       " 835023,\n",
       " 90229,\n",
       " 1049723,\n",
       " 168530,\n",
       " 413337,\n",
       " 1059336,\n",
       " 418380,\n",
       " 35987,\n",
       " 407189,\n",
       " 562560,\n",
       " 484291,\n",
       " 178467,\n",
       " 664856,\n",
       " 175617,\n",
       " 715431,\n",
       " 1127600,\n",
       " 279901,\n",
       " 1120263,\n",
       " 284050,\n",
       " 1014935,\n",
       " 1032400,\n",
       " 835413,\n",
       " 59191,\n",
       " 538657,\n",
       " 1019467,\n",
       " 714125,\n",
       " 830080,\n",
       " 470076,\n",
       " 1051213,\n",
       " 264463,\n",
       " 12500,\n",
       " 1036988,\n",
       " 720150,\n",
       " 256515,\n",
       " 109964,\n",
       " 756328,\n",
       " 966286,\n",
       " 758835,\n",
       " 882401,\n",
       " 661665,\n",
       " 752186,\n",
       " 454231,\n",
       " 941719,\n",
       " 719392,\n",
       " 403639,\n",
       " 378905,\n",
       " 801897,\n",
       " 130950,\n",
       " 869746,\n",
       " 787134,\n",
       " 1049571,\n",
       " 556750,\n",
       " 366747,\n",
       " 789377,\n",
       " 772836,\n",
       " 145037,\n",
       " 620545,\n",
       " 256537,\n",
       " 556617,\n",
       " 1054510,\n",
       " 675773,\n",
       " 115157,\n",
       " 798144,\n",
       " 108221,\n",
       " 814571,\n",
       " 626029,\n",
       " 225372,\n",
       " 976325,\n",
       " 680935,\n",
       " 508920,\n",
       " 934119,\n",
       " 557662,\n",
       " 921114,\n",
       " 721532,\n",
       " 520960,\n",
       " 955223,\n",
       " 1050664,\n",
       " 576761,\n",
       " 707114,\n",
       " 102275,\n",
       " 382113,\n",
       " 258661,\n",
       " 41758,\n",
       " 897832,\n",
       " 1041148,\n",
       " 276592,\n",
       " 1001016,\n",
       " 1122197,\n",
       " 89674,\n",
       " 986307,\n",
       " 1136472,\n",
       " 296855,\n",
       " 683338,\n",
       " 775486,\n",
       " 463170,\n",
       " 67431,\n",
       " 971833,\n",
       " 1057208,\n",
       " 605469,\n",
       " 29229,\n",
       " 672395,\n",
       " 810551,\n",
       " 477263,\n",
       " 131356,\n",
       " 531338,\n",
       " 597882,\n",
       " 352364,\n",
       " 872534,\n",
       " 749995,\n",
       " 891240,\n",
       " 91029,\n",
       " 27200,\n",
       " 1041885,\n",
       " 345546,\n",
       " 415741,\n",
       " 97771,\n",
       " 565077,\n",
       " 1100527,\n",
       " 347977,\n",
       " 1114073,\n",
       " 406967,\n",
       " 634918,\n",
       " 1048237,\n",
       " 980191,\n",
       " 470048,\n",
       " 592334,\n",
       " 1106898,\n",
       " 193270,\n",
       " 216484,\n",
       " 928435,\n",
       " 1142866,\n",
       " 585733,\n",
       " 409571,\n",
       " 1092000,\n",
       " 142134,\n",
       " 822887,\n",
       " 852309,\n",
       " 940689,\n",
       " 232674,\n",
       " 126147,\n",
       " 907352,\n",
       " 914382,\n",
       " 1084838,\n",
       " 747563,\n",
       " 322642,\n",
       " 1034354,\n",
       " 282193,\n",
       " 407811,\n",
       " 443820,\n",
       " 506066,\n",
       " 78762,\n",
       " 512709,\n",
       " 436574,\n",
       " 154014,\n",
       " 846516,\n",
       " 54238,\n",
       " 22976,\n",
       " 864494,\n",
       " 675113,\n",
       " 1146990,\n",
       " 62809,\n",
       " 87748,\n",
       " 517014,\n",
       " 913653,\n",
       " 611074,\n",
       " 389919,\n",
       " 637921,\n",
       " 236389,\n",
       " 592546,\n",
       " 681184,\n",
       " 444619,\n",
       " 1081071,\n",
       " 54455,\n",
       " 758189,\n",
       " 320601,\n",
       " 977053,\n",
       " 471720,\n",
       " 868825,\n",
       " 465671,\n",
       " 1070707,\n",
       " 911428,\n",
       " 819301,\n",
       " 396273,\n",
       " 818071,\n",
       " 161624,\n",
       " 1042144,\n",
       " 89327,\n",
       " 601433,\n",
       " 291971,\n",
       " 997501,\n",
       " 224059,\n",
       " 264196,\n",
       " 255861,\n",
       " 964908,\n",
       " 740050,\n",
       " 36537,\n",
       " 933298,\n",
       " 1092348,\n",
       " 740307,\n",
       " 605566,\n",
       " 760831,\n",
       " 447476,\n",
       " 819118,\n",
       " 99059,\n",
       " 221725,\n",
       " 1066443,\n",
       " 198929,\n",
       " 681289,\n",
       " 173582,\n",
       " 431910,\n",
       " 805900,\n",
       " 377060,\n",
       " 878265,\n",
       " 264549,\n",
       " 996491,\n",
       " 294801,\n",
       " 11146,\n",
       " 340925,\n",
       " 180998,\n",
       " 694210,\n",
       " 67719,\n",
       " 205964,\n",
       " 307042,\n",
       " 459429,\n",
       " 959669,\n",
       " 902206,\n",
       " 421152,\n",
       " 848645,\n",
       " 125043,\n",
       " 118215,\n",
       " 318132,\n",
       " 239885,\n",
       " 967488,\n",
       " 189346,\n",
       " 281709,\n",
       " 86357,\n",
       " 752736,\n",
       " 921644,\n",
       " 432745,\n",
       " 501516,\n",
       " 493109,\n",
       " 904503,\n",
       " 716087,\n",
       " 299906,\n",
       " 187491,\n",
       " 20009,\n",
       " 611709,\n",
       " 686569,\n",
       " 840353,\n",
       " 724681,\n",
       " 480043,\n",
       " 127664,\n",
       " 121540,\n",
       " 135482,\n",
       " 231375,\n",
       " 523609,\n",
       " 604122,\n",
       " 491725,\n",
       " 262383,\n",
       " 1687,\n",
       " 1139035,\n",
       " 552101,\n",
       " 882632,\n",
       " 771216,\n",
       " 777227,\n",
       " 273156,\n",
       " 874231,\n",
       " 69671,\n",
       " 606766,\n",
       " 733699,\n",
       " 657401,\n",
       " 6892,\n",
       " 735140,\n",
       " 1061919,\n",
       " 6079,\n",
       " 616845,\n",
       " 167530,\n",
       " 793819,\n",
       " 385169,\n",
       " 682915,\n",
       " 932641,\n",
       " 219400,\n",
       " 1119979,\n",
       " 416757,\n",
       " 836914,\n",
       " 148076,\n",
       " 401981,\n",
       " 430634,\n",
       " 751340,\n",
       " 896262,\n",
       " 1008449,\n",
       " 594122,\n",
       " 1142270,\n",
       " 342581,\n",
       " 812204,\n",
       " 56025,\n",
       " 546023,\n",
       " 65258,\n",
       " 338387,\n",
       " 404069,\n",
       " 766551,\n",
       " 385881,\n",
       " 211420,\n",
       " 286015,\n",
       " 212640,\n",
       " 567175,\n",
       " 254291,\n",
       " 154333,\n",
       " 757303,\n",
       " 119078,\n",
       " 534461,\n",
       " 757390,\n",
       " 272820,\n",
       " 528632,\n",
       " 861400,\n",
       " 194544,\n",
       " 545223,\n",
       " 1089301,\n",
       " 250353,\n",
       " 1121839,\n",
       " 253657,\n",
       " 691618,\n",
       " 601670,\n",
       " 646787,\n",
       " 921714,\n",
       " 492782,\n",
       " 11221,\n",
       " 196228,\n",
       " 237492,\n",
       " 211657,\n",
       " 924725,\n",
       " 814234,\n",
       " 752392,\n",
       " 378105,\n",
       " 277462,\n",
       " 812471,\n",
       " 730,\n",
       " 871071,\n",
       " 439680,\n",
       " 503279,\n",
       " 8960,\n",
       " 874948,\n",
       " 271879,\n",
       " 175857,\n",
       " 366271,\n",
       " 1124340,\n",
       " 559272,\n",
       " 883535,\n",
       " 352631,\n",
       " 818167,\n",
       " 640838,\n",
       " 136144,\n",
       " 49969,\n",
       " 255885,\n",
       " 825624,\n",
       " 558081,\n",
       " 112323,\n",
       " 1140006,\n",
       " 394254,\n",
       " 650814,\n",
       " 653065,\n",
       " 1147987,\n",
       " 709294,\n",
       " 47523,\n",
       " 304645,\n",
       " 646161,\n",
       " 597447,\n",
       " 419355,\n",
       " 895433,\n",
       " 444527,\n",
       " 1043320,\n",
       " 94302,\n",
       " 886512,\n",
       " 137703,\n",
       " 322871,\n",
       " 356838,\n",
       " 99285,\n",
       " 466357,\n",
       " 131556,\n",
       " 941570,\n",
       " 398080,\n",
       " 840368,\n",
       " 910220,\n",
       " 1121554,\n",
       " 765728,\n",
       " 156459,\n",
       " 453377,\n",
       " 188095,\n",
       " 921317,\n",
       " 89614,\n",
       " 1121836,\n",
       " 653176,\n",
       " 65505,\n",
       " 436695,\n",
       " 74733,\n",
       " 327544,\n",
       " 1101688,\n",
       " 206803,\n",
       " 106452,\n",
       " 863570,\n",
       " 990900,\n",
       " 806012,\n",
       " 699942,\n",
       " 382605,\n",
       " 848726,\n",
       " 898912,\n",
       " 217962,\n",
       " 183103,\n",
       " 91237,\n",
       " 452969,\n",
       " 319263,\n",
       " 285083,\n",
       " 633261,\n",
       " 765021,\n",
       " 1069771,\n",
       " 882484,\n",
       " 551957,\n",
       " 594903,\n",
       " 861875,\n",
       " 385935,\n",
       " 1118852,\n",
       " 1109686,\n",
       " 192149,\n",
       " 4978,\n",
       " 302044,\n",
       " 1089983,\n",
       " 212087,\n",
       " 952204,\n",
       " 516509,\n",
       " 1005376,\n",
       " 61762,\n",
       " 779435,\n",
       " 621299,\n",
       " 976012,\n",
       " 783233,\n",
       " 596045,\n",
       " 1129327,\n",
       " 710147,\n",
       " 416666,\n",
       " 354801,\n",
       " 83209,\n",
       " 786209,\n",
       " 109864,\n",
       " 203064,\n",
       " 1029344,\n",
       " 781087,\n",
       " 883687,\n",
       " 371620,\n",
       " 219616,\n",
       " 152751,\n",
       " 485551,\n",
       " 804665,\n",
       " 284784,\n",
       " 1062166,\n",
       " 208527,\n",
       " 1023643,\n",
       " 1102436,\n",
       " 485971,\n",
       " 1101458,\n",
       " 1043396,\n",
       " 703065,\n",
       " 661239,\n",
       " 872957,\n",
       " 560817,\n",
       " 708507,\n",
       " 1008496,\n",
       " 370053,\n",
       " 493413,\n",
       " 214148,\n",
       " 110598,\n",
       " 1081654,\n",
       " 301385,\n",
       " 773880,\n",
       " 84976,\n",
       " 294237,\n",
       " 308638,\n",
       " 350728,\n",
       " 837626,\n",
       " 375029,\n",
       " 522242,\n",
       " 1066677,\n",
       " 383039,\n",
       " 1019013,\n",
       " 1048855,\n",
       " 10991,\n",
       " 986913,\n",
       " 326666,\n",
       " 580262,\n",
       " 734385,\n",
       " 1058912,\n",
       " 920159,\n",
       " 471446,\n",
       " 140275,\n",
       " 895225,\n",
       " 990655,\n",
       " 831120,\n",
       " 668110,\n",
       " 99155,\n",
       " 900474,\n",
       " 873334,\n",
       " 185073,\n",
       " 686426,\n",
       " 929899,\n",
       " 972748,\n",
       " 30341,\n",
       " 234151,\n",
       " 79704,\n",
       " 739630,\n",
       " 765748,\n",
       " 671750,\n",
       " 499782,\n",
       " 1149754,\n",
       " 998463,\n",
       " 715449,\n",
       " 489815,\n",
       " 68495,\n",
       " 387247,\n",
       " 265647,\n",
       " 941170,\n",
       " 424322,\n",
       " 983346,\n",
       " 898770,\n",
       " 29876,\n",
       " 730205,\n",
       " 262216,\n",
       " 564486,\n",
       " 747551,\n",
       " 1141674,\n",
       " 651711,\n",
       " 149932,\n",
       " 725600,\n",
       " 431650,\n",
       " 98373,\n",
       " 247675,\n",
       " 269563,\n",
       " 1084426,\n",
       " 21081,\n",
       " 1019358,\n",
       " 1080897,\n",
       " 881715,\n",
       " 838210,\n",
       " 1047647,\n",
       " 134457,\n",
       " 395178,\n",
       " 384724,\n",
       " 732095,\n",
       " 480006,\n",
       " 690151,\n",
       " 869687,\n",
       " 1024044,\n",
       " 245292,\n",
       " 830302,\n",
       " 153605,\n",
       " 753034,\n",
       " 1068851,\n",
       " 787618,\n",
       " 214983,\n",
       " 410952,\n",
       " 539302,\n",
       " 187985,\n",
       " 253860,\n",
       " 772147,\n",
       " 366816,\n",
       " 398503,\n",
       " 172810,\n",
       " 137151,\n",
       " 885524,\n",
       " 940566,\n",
       " 915974,\n",
       " 938218,\n",
       " 84673,\n",
       " 869504,\n",
       " 108104,\n",
       " 196960,\n",
       " 627310,\n",
       " 1064306,\n",
       " 823297,\n",
       " 789417,\n",
       " 696949,\n",
       " 771291,\n",
       " 732272,\n",
       " 132346,\n",
       " 698591,\n",
       " 388873,\n",
       " 253950,\n",
       " 56545,\n",
       " 931959,\n",
       " 821739,\n",
       " 1048758,\n",
       " 673920,\n",
       " 69142,\n",
       " 429117,\n",
       " 601889,\n",
       " 662863,\n",
       " 602012,\n",
       " 318152,\n",
       " 670651,\n",
       " 989202,\n",
       " 756439,\n",
       " 474776,\n",
       " 1120703,\n",
       " 72267,\n",
       " 987566,\n",
       " 326563,\n",
       " 436186,\n",
       " 692428,\n",
       " 504832,\n",
       " 997963,\n",
       " 464807,\n",
       " 654636,\n",
       " 341123,\n",
       " 412899,\n",
       " 972134,\n",
       " 1011474,\n",
       " 693777,\n",
       " 998308,\n",
       " 937273,\n",
       " 971488,\n",
       " 565547,\n",
       " 915108,\n",
       " 615375,\n",
       " 166356,\n",
       " 825550,\n",
       " 977247,\n",
       " 206661,\n",
       " 675497,\n",
       " 802724,\n",
       " 1112313,\n",
       " 271197,\n",
       " 488947,\n",
       " 120296,\n",
       " 337667,\n",
       " 872923,\n",
       " 1067939,\n",
       " 931441,\n",
       " 571915,\n",
       " 492963,\n",
       " 609368,\n",
       " 366935,\n",
       " 1091089,\n",
       " 497956,\n",
       " 875022,\n",
       " 173847,\n",
       " 808617,\n",
       " 1148637,\n",
       " 132492,\n",
       " 772276,\n",
       " 976831,\n",
       " 282847,\n",
       " 352816,\n",
       " 722030,\n",
       " 269181,\n",
       " 293044,\n",
       " 638183,\n",
       " 872316,\n",
       " 323973,\n",
       " 336192,\n",
       " 952491,\n",
       " 562512,\n",
       " 486553,\n",
       " 411430,\n",
       " 622232,\n",
       " 401121,\n",
       " 103150,\n",
       " 648223,\n",
       " 402254,\n",
       " 938155,\n",
       " 53999,\n",
       " 379389,\n",
       " 332318,\n",
       " 698432,\n",
       " 338213,\n",
       " 683223,\n",
       " 82865,\n",
       " 210899,\n",
       " 510396,\n",
       " 86585,\n",
       " 728612,\n",
       " 451989,\n",
       " 175258,\n",
       " 366484,\n",
       " 968530,\n",
       " 912529,\n",
       " 360797,\n",
       " 198188,\n",
       " 1099292,\n",
       " 106377,\n",
       " 497123,\n",
       " 213959,\n",
       " 869164,\n",
       " 326679,\n",
       " 498099,\n",
       " 643532,\n",
       " 358249,\n",
       " 944903,\n",
       " 268112,\n",
       " 773413,\n",
       " 838469,\n",
       " 47282,\n",
       " 1022339,\n",
       " 652032,\n",
       " 908495,\n",
       " 905702,\n",
       " 334966,\n",
       " 301381,\n",
       " 403577,\n",
       " 479885,\n",
       " 627810,\n",
       " 924923,\n",
       " 1060676,\n",
       " 306722,\n",
       " 413855,\n",
       " 333149,\n",
       " 1110303,\n",
       " 353721,\n",
       " 487363,\n",
       " 1045670,\n",
       " 248936,\n",
       " 198066,\n",
       " 634702,\n",
       " 371650,\n",
       " 34206,\n",
       " 1046159,\n",
       " 849686,\n",
       " 485076,\n",
       " 485994,\n",
       " 905554,\n",
       " 163568,\n",
       " 562565,\n",
       " 527432,\n",
       " 623014,\n",
       " 557870,\n",
       " 495074,\n",
       " 317657,\n",
       " 428469,\n",
       " 398744,\n",
       " 18562,\n",
       " 189848,\n",
       " 859949,\n",
       " 1075705,\n",
       " 634375,\n",
       " 1023988,\n",
       " 148905,\n",
       " 389049,\n",
       " 974997,\n",
       " 677793,\n",
       " 1058551,\n",
       " 151076,\n",
       " 914491,\n",
       " 1141980,\n",
       " 650380,\n",
       " 201003,\n",
       " 945582,\n",
       " 51170,\n",
       " 296587,\n",
       " 555883,\n",
       " 700745,\n",
       " 266862,\n",
       " 924954,\n",
       " 980983,\n",
       " 634185,\n",
       " 244015,\n",
       " 1038214,\n",
       " 1006276,\n",
       " 735650,\n",
       " 781706,\n",
       " 260931,\n",
       " 483990,\n",
       " 751646,\n",
       " 533716,\n",
       " 560773,\n",
       " 1105305,\n",
       " 193499,\n",
       " 217048,\n",
       " 19277,\n",
       " 727195,\n",
       " 784726,\n",
       " 944158,\n",
       " 938337,\n",
       " 812435,\n",
       " 315791,\n",
       " 374101,\n",
       " 503888,\n",
       " 376309,\n",
       " 696965,\n",
       " 434083,\n",
       " 950254,\n",
       " 301236,\n",
       " 511392,\n",
       " 898230,\n",
       " 779934,\n",
       " 791880,\n",
       " 337612,\n",
       " 541850,\n",
       " 768051,\n",
       " 829422,\n",
       " 1121091,\n",
       " 907689,\n",
       " 11869,\n",
       " 484354,\n",
       " 995680,\n",
       " 472817,\n",
       " 481443,\n",
       " 324567,\n",
       " 721185,\n",
       " 932828,\n",
       " 671763,\n",
       " 7845,\n",
       " 977803,\n",
       " 706265,\n",
       " 952390,\n",
       " 113574,\n",
       " 497935,\n",
       " 47926,\n",
       " 544254,\n",
       " 279500,\n",
       " 568045,\n",
       " 382396,\n",
       " 1030814,\n",
       " 382315,\n",
       " 333850,\n",
       " 507412,\n",
       " ...]"
      ]
     },
     "execution_count": 115,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "random.seed(123)\n",
    "text_index_s = random.sample(\n",
    "    df_data.index.tolist(),\n",
    "    int(len(df_data) * 0.3)\n",
    ")\n",
    "text_index_s"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 116,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "      <th>item_id</th>\n",
       "      <th>rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>109814</th>\n",
       "      <td>27462</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "      <td>1587492695</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>561359</th>\n",
       "      <td>137190</td>\n",
       "      <td>france</td>\n",
       "      <td>3</td>\n",
       "      <td>0552997234</td>\n",
       "      <td>8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>182843</th>\n",
       "      <td>42721</td>\n",
       "      <td>canada</td>\n",
       "      <td>3</td>\n",
       "      <td>0671024108</td>\n",
       "      <td>8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>854047</th>\n",
       "      <td>208829</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0140503897</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>559003</th>\n",
       "      <td>136348</td>\n",
       "      <td>usa</td>\n",
       "      <td>4</td>\n",
       "      <td>0807220299</td>\n",
       "      <td>9</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        user_id location  age     item_id  rating\n",
       "109814    27462      usa    0  1587492695       0\n",
       "561359   137190   france    3  0552997234       8\n",
       "182843    42721   canada    3  0671024108       8\n",
       "854047   208829   canada    0  0140503897       0\n",
       "559003   136348      usa    4  0807220299       9"
      ]
     },
     "execution_count": 116,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_data_text = df_data.loc[text_index_s]\n",
    "df_data_text.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 117,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "      <th>item_id</th>\n",
       "      <th>rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2</td>\n",
       "      <td>usa</td>\n",
       "      <td>3</td>\n",
       "      <td>0195153448</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>7</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "      <td>034542252</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0002005018</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0060973129</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0374157065</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id location  age     item_id  rating\n",
       "0        2      usa    3  0195153448       0\n",
       "1        7      usa    0   034542252       0\n",
       "2        8   canada    0  0002005018       5\n",
       "3        8   canada    0  0060973129       0\n",
       "4        8   canada    0  0374157065       0"
      ]
     },
     "execution_count": 117,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_data_training = df_data[\n",
    "    ~df_data.index.isin(text_index_s)\n",
    "]\n",
    "df_data_training.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 保存数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 118,
   "metadata": {},
   "outputs": [],
   "source": [
    "cPickle.dump(\n",
    "    df_data_text,open('./data/df_data_text.pkl','wb')\n",
    ")\n",
    "cPickle.dump(\n",
    "    df_data_training,open('./data/df_data_training.pkl','wb')\n",
    ")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 导入训练集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 119,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "      <th>item_id</th>\n",
       "      <th>rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>2</td>\n",
       "      <td>usa</td>\n",
       "      <td>3</td>\n",
       "      <td>0195153448</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>7</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "      <td>034542252</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0002005018</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0060973129</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>8</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0374157065</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   user_id location  age     item_id  rating\n",
       "0        2      usa    3  0195153448       0\n",
       "1        7      usa    0   034542252       0\n",
       "2        8   canada    0  0002005018       5\n",
       "3        8   canada    0  0060973129       0\n",
       "4        8   canada    0  0374157065       0"
      ]
     },
     "execution_count": 119,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_data_training = cPickle.load(open('./data/df_data_training.pkl','rb'))\n",
    "df_data_training.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 120,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['usa',\n",
       " 'canada',\n",
       " 'united kingdom',\n",
       " 'germany',\n",
       " '',\n",
       " 'australia',\n",
       " 'spain',\n",
       " 'france',\n",
       " 'n/a',\n",
       " 'italy',\n",
       " 'portugal']"
      ]
     },
     "execution_count": 120,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_data_training['location'].value_counts()[:11].index.tolist()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 121,
   "metadata": {},
   "outputs": [],
   "source": [
    "top10_location = ['usa',\n",
    " 'canada',\n",
    " 'united kingdom',\n",
    " 'germany',\n",
    " 'australia',\n",
    " 'spain',\n",
    " 'france',\n",
    " 'n/a',\n",
    " 'italy',\n",
    " 'portugal']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 122,
   "metadata": {},
   "outputs": [],
   "source": [
    "df_data_training['location'] = df_data_training['location'].apply(lambda location:location if location in top10_location else 'other')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 123,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "usa               537641\n",
       "canada             72451\n",
       "other              60023\n",
       "united kingdom     35354\n",
       "germany            27687\n",
       "australia          18604\n",
       "spain              17949\n",
       "france              9735\n",
       "n/a                 9541\n",
       "italy               8482\n",
       "portugal            7374\n",
       "Name: location, dtype: int64"
      ]
     },
     "execution_count": 123,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_data_training['location'].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 124,
   "metadata": {},
   "outputs": [],
   "source": [
    "from collections import defaultdict"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 125,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<pandas.core.groupby.generic.SeriesGroupBy object at 0x0000021208D0EB08>"
      ]
     },
     "execution_count": 125,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "feature_recommand = defaultdict(dict)\n",
    "feature_recommand_with_rating = defaultdict(dict)\n",
    "\n",
    "groupby_location_age_top = []\n",
    "\n",
    "for location,groupby_location in df_data_training.groupby('location'):\n",
    "    for age,groupby_location_age in groupby_location.groupby('age'):\n",
    "        item_id_value_counts = groupby_location_age['item_id'].value_counts()\n",
    "        divide_boundary = max(np.percentile(item_id_value_counts,75),5)\n",
    "        groupby_location_age_top = groupby_location_age[\n",
    "            groupby_location_age['item_id'].isin(\n",
    "            item_id_value_counts[item_id_value_counts >= divide_boundary].index\n",
    "        )]\n",
    "        item_mean_rating = groupby_location_age_top.groupby('item_id')['rating'].mean().sort_values(ascending=False)[:20]\n",
    "        feature_recommand[location][age] = [\n",
    "            item_id\n",
    "            for item_id in item_mean_rating.index if item_mean_rating[item_id] >= 5\n",
    "        ]\n",
    "        feature_recommand_with_rating[location][age] = [\n",
    "            {\"%s\" % item_id : round(item_mean_rating[item_id],2)}\n",
    "            for item_id in item_mean_rating.index if item_mean_rating[item_id] >= 5\n",
    "        ]\n",
    "        \n",
    "item_mean_rating = groupby_location_age_top.groupby('item_id')['rating']\n",
    "item_mean_rating"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 126,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "defaultdict(dict,\n",
       "            {'australia': {0: ['0099771519', '1857022424'],\n",
       "              1: [],\n",
       "              2: [],\n",
       "              3: ['0552998486',\n",
       "               '015602943X',\n",
       "               '0552140295',\n",
       "               '0440220602',\n",
       "               '0446532231',\n",
       "               '0007170866',\n",
       "               '1875989218',\n",
       "               '0099727412',\n",
       "               '0860074382',\n",
       "               '0140008535',\n",
       "               '0385335482',\n",
       "               '0553279556',\n",
       "               '1400034779',\n",
       "               '0743225082',\n",
       "               '0949206318'],\n",
       "              4: ['0091867770'],\n",
       "              5: []},\n",
       "             'canada': {0: ['0140505865',\n",
       "               '0140067477',\n",
       "               '076790592X',\n",
       "               '0553250426',\n",
       "               '0060392452',\n",
       "               '0676974791',\n",
       "               '080410526X',\n",
       "               '1552783081',\n",
       "               '0446350982',\n",
       "               '038079487X',\n",
       "               '0385505833',\n",
       "               '0676972152',\n",
       "               '0786867647',\n",
       "               '0060959037',\n",
       "               '0771099894',\n",
       "               '0812550706',\n",
       "               '0425122123',\n",
       "               '0446667900',\n",
       "               '0671011375',\n",
       "               '1550541129'],\n",
       "              1: [],\n",
       "              2: [],\n",
       "              3: ['0060915544',\n",
       "               '0140042393',\n",
       "               '0552137030',\n",
       "               '0836220889',\n",
       "               '0425105334',\n",
       "               '0836218256',\n",
       "               '0140277439',\n",
       "               '0345338588',\n",
       "               '1853260002',\n",
       "               '0060935464',\n",
       "               '0836218353',\n",
       "               '0671868691',\n",
       "               '0446532231',\n",
       "               '038542017X',\n",
       "               '0440224764',\n",
       "               '0770422578',\n",
       "               '0006485278',\n",
       "               '0451163524',\n",
       "               '0771060548',\n",
       "               '0553287893'],\n",
       "              4: ['0380718839',\n",
       "               '0316666343',\n",
       "               '0345370775',\n",
       "               '0684872153',\n",
       "               '0671758896',\n",
       "               '0676974805',\n",
       "               '0440213525',\n",
       "               '0515111279',\n",
       "               '034540288X',\n",
       "               '0676973094',\n",
       "               '0671027360',\n",
       "               '0684874350'],\n",
       "              5: []},\n",
       "             'france': {0: [],\n",
       "              1: [],\n",
       "              2: [],\n",
       "              3: ['2070370003',\n",
       "               '2070408507',\n",
       "               '2253140872',\n",
       "               '2266084372',\n",
       "               '2877302202',\n",
       "               '22530152730',\n",
       "               '2070744833',\n",
       "               '2253072079',\n",
       "               '2277260029',\n",
       "               '2290302155',\n",
       "               '2070363317',\n",
       "               '2253153265',\n",
       "               '2253144452',\n",
       "               '2264016124',\n",
       "               '2226135022',\n",
       "               '2020306492',\n",
       "               '2253154393',\n",
       "               '2290308285',\n",
       "               '2253150711',\n",
       "               '229030039X'],\n",
       "              4: [],\n",
       "              5: []},\n",
       "             'germany': {0: ['3518366823',\n",
       "               '3423072571',\n",
       "               '3518368540',\n",
       "               '3423203668',\n",
       "               '3426029553',\n",
       "               '3453007867',\n",
       "               '3404148665'],\n",
       "              1: [],\n",
       "              2: [],\n",
       "              3: ['3551551936',\n",
       "               '3551551693',\n",
       "               '3551551677',\n",
       "               '3423071516',\n",
       "               '3518372742',\n",
       "               '3257230478',\n",
       "               '3442727952',\n",
       "               '3442724686',\n",
       "               '3518100734',\n",
       "               '3596215226',\n",
       "               '3150000017',\n",
       "               '3426612704',\n",
       "               '3423205202',\n",
       "               '3499224615',\n",
       "               '3423202947',\n",
       "               '3442442354',\n",
       "               '3453071174',\n",
       "               '3551551685',\n",
       "               '3423204206',\n",
       "               '3518388762'],\n",
       "              4: [],\n",
       "              5: []},\n",
       "             'italy': {0: ['8806142100',\n",
       "               '8826703132',\n",
       "               '884590184X',\n",
       "               '8817131628'],\n",
       "              2: [],\n",
       "              3: ['8845205118',\n",
       "               '8807813823',\n",
       "               '8845915700',\n",
       "               '8817106259',\n",
       "               '8807701510',\n",
       "               '8807816067',\n",
       "               '881786983X',\n",
       "               '0743222229',\n",
       "               '8807817039',\n",
       "               '8807814684',\n",
       "               '8806161741',\n",
       "               '884541096X',\n",
       "               '8845290077',\n",
       "               '8817106100',\n",
       "               '0451164075',\n",
       "               '8807816059',\n",
       "               '8804342838',\n",
       "               '9770390107900'],\n",
       "              4: [],\n",
       "              5: []},\n",
       "             'n/a': {0: [], 3: [], 4: []},\n",
       "             'other': {0: ['8826703132',\n",
       "               '0060008024',\n",
       "               '0439064872',\n",
       "               '1558743669',\n",
       "               '0440211727',\n",
       "               '0330332775',\n",
       "               '0140298479',\n",
       "               '0380789019',\n",
       "               '034536676X',\n",
       "               '0446679593',\n",
       "               '0316693251',\n",
       "               '0316693006',\n",
       "               '1400034779',\n",
       "               '0345337662',\n",
       "               '0375706771',\n",
       "               '0385335881',\n",
       "               '0345339681',\n",
       "               '0553296981',\n",
       "               '044651652X',\n",
       "               '0062502182'],\n",
       "              1: [],\n",
       "              2: [],\n",
       "              3: ['0553296981',\n",
       "               '0441001971',\n",
       "               '0590353403',\n",
       "               '0671793489',\n",
       "               '0553213148',\n",
       "               '0515131229',\n",
       "               '0446310786',\n",
       "               '0439139597',\n",
       "               '0345378490',\n",
       "               '0747546290',\n",
       "               '0842329218',\n",
       "               '0312924585',\n",
       "               '3257228007',\n",
       "               '0786868716',\n",
       "               '051513628X',\n",
       "               '0151008116',\n",
       "               '0061092177',\n",
       "               '0375702709',\n",
       "               '0099800403',\n",
       "               '0439136350'],\n",
       "              4: [],\n",
       "              5: []},\n",
       "             'portugal': {0: [],\n",
       "              1: [],\n",
       "              2: [],\n",
       "              3: ['038082101X',\n",
       "               '0439139600',\n",
       "               '0380815923',\n",
       "               '006050918X',\n",
       "               '9505156944',\n",
       "               '0380977788',\n",
       "               '002542730X',\n",
       "               '0460877305',\n",
       "               '0385721234',\n",
       "               '0385413041',\n",
       "               '9726081378',\n",
       "               '0811214982',\n",
       "               '0330262130',\n",
       "               '0880381744',\n",
       "               '0552137030',\n",
       "               '9722113747',\n",
       "               '9580464162',\n",
       "               '9724614565',\n",
       "               '1401201385'],\n",
       "              4: [],\n",
       "              5: []},\n",
       "             'spain': {0: [],\n",
       "              1: [],\n",
       "              2: [],\n",
       "              3: ['8445071416',\n",
       "               '8420616893',\n",
       "               '8420613487',\n",
       "               '950491036X',\n",
       "               '8478886508',\n",
       "               '8478886451',\n",
       "               '0156013924',\n",
       "               '8408039369',\n",
       "               '8420636282',\n",
       "               '8495501074',\n",
       "               '8420432113',\n",
       "               '8440627203',\n",
       "               '8445071408',\n",
       "               '0452282152',\n",
       "               '9681501225',\n",
       "               '8445071769',\n",
       "               '8420466034',\n",
       "               '8445071394',\n",
       "               '8423309223',\n",
       "               '8433914545'],\n",
       "              4: ['8408043641'],\n",
       "              5: []},\n",
       "             'united kingdom': {0: ['0590660543',\n",
       "               '000649840X',\n",
       "               '0330367358',\n",
       "               '0330376519',\n",
       "               '1857027051',\n",
       "               '0749395990',\n",
       "               '0552124753',\n",
       "               '0099771519',\n",
       "               '0749399902'],\n",
       "              1: [],\n",
       "              2: [],\n",
       "              3: ['1844262553',\n",
       "               '0091891965',\n",
       "               '0140620117',\n",
       "               '0330258648',\n",
       "               '1860465811',\n",
       "               '1857231384',\n",
       "               '0552145424',\n",
       "               '0440206154',\n",
       "               '0552131059',\n",
       "               '0192833596',\n",
       "               '0440235596',\n",
       "               '0552142379',\n",
       "               '0330267388',\n",
       "               '0671024337',\n",
       "               '0380002930',\n",
       "               '0722532938',\n",
       "               '0552149519',\n",
       "               '0140287248',\n",
       "               '0380813815',\n",
       "               '0064407667'],\n",
       "              4: ['1844262553', '0552147680', '0552131067', '0552996181'],\n",
       "              5: []},\n",
       "             'usa': {0: ['0156004801',\n",
       "               '0060256672',\n",
       "               '0971942315',\n",
       "               '1576738167',\n",
       "               '0553351397',\n",
       "               '0441002935',\n",
       "               '0615116426',\n",
       "               '0316735027',\n",
       "               '0140309578',\n",
       "               '0140185232',\n",
       "               '0553148001',\n",
       "               '0395977894',\n",
       "               '0743455967',\n",
       "               '0618002235',\n",
       "               '039480029X',\n",
       "               '0877738513',\n",
       "               '0060248025',\n",
       "               '0807083054',\n",
       "               '0553380958',\n",
       "               '0553213504'],\n",
       "              1: ['0064407667', '0439064872', '059035342X'],\n",
       "              2: ['0590353403',\n",
       "               '0440237688',\n",
       "               '0451191137',\n",
       "               '0439139597',\n",
       "               '0679886370',\n",
       "               '0140348107',\n",
       "               '0064472272',\n",
       "               '0439064864',\n",
       "               '0671027344',\n",
       "               '0446608955',\n",
       "               '0394820371',\n",
       "               '0385729332',\n",
       "               '0316666343',\n",
       "               '0385729340',\n",
       "               '0385730586',\n",
       "               '043935806X',\n",
       "               '0439136350',\n",
       "               '1576738159',\n",
       "               '0440439884',\n",
       "               '0345342968'],\n",
       "              3: ['0066238501',\n",
       "               '0517693119',\n",
       "               '0394800389',\n",
       "               '0920668364',\n",
       "               '0395177111',\n",
       "               '0890876789',\n",
       "               '0898159954',\n",
       "               '0316286850',\n",
       "               '0375503803',\n",
       "               '0316779059',\n",
       "               '156402976X',\n",
       "               '0553110845',\n",
       "               '0060256737',\n",
       "               '0060968966',\n",
       "               '0670451932',\n",
       "               '0805013407',\n",
       "               '0060961325',\n",
       "               '0140195831',\n",
       "               '0451525663',\n",
       "               '0451171926'],\n",
       "              4: ['0312303467',\n",
       "               '0060514957',\n",
       "               '0553377868',\n",
       "               '0688167888',\n",
       "               '0399151451',\n",
       "               '1579546463',\n",
       "               '0380977311',\n",
       "               '0553379615',\n",
       "               '0943233828',\n",
       "               '0446532452',\n",
       "               '0553565079',\n",
       "               '0066214769',\n",
       "               '0446322180',\n",
       "               '0439064864',\n",
       "               '0399151613',\n",
       "               '0449911519',\n",
       "               '0451169514',\n",
       "               '0553802461',\n",
       "               '0312983220',\n",
       "               '0312983301'],\n",
       "              5: ['0440234743', '044022165X']}})"
      ]
     },
     "execution_count": 126,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "feature_recommand"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 127,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "defaultdict(dict,\n",
       "            {'australia': {0: [{'0099771519': 7.0}, {'1857022424': 5.33}],\n",
       "              1: [],\n",
       "              2: [],\n",
       "              3: [{'0552998486': 8.8},\n",
       "               {'015602943X': 7.2},\n",
       "               {'0552140295': 6.8},\n",
       "               {'0440220602': 6.6},\n",
       "               {'0446532231': 6.2},\n",
       "               {'0007170866': 6.14},\n",
       "               {'1875989218': 6.09},\n",
       "               {'0099727412': 6.0},\n",
       "               {'0860074382': 5.91},\n",
       "               {'0140008535': 5.86},\n",
       "               {'0385335482': 5.71},\n",
       "               {'0553279556': 5.67},\n",
       "               {'1400034779': 5.4},\n",
       "               {'0743225082': 5.33},\n",
       "               {'0949206318': 5.17}],\n",
       "              4: [{'0091867770': 5.17}],\n",
       "              5: []},\n",
       "             'canada': {0: [{'0140505865': 9.4},\n",
       "               {'0140067477': 7.86},\n",
       "               {'076790592X': 7.4},\n",
       "               {'0553250426': 7.12},\n",
       "               {'0060392452': 7.0},\n",
       "               {'0676974791': 6.83},\n",
       "               {'080410526X': 6.8},\n",
       "               {'1552783081': 6.8},\n",
       "               {'0446350982': 6.8},\n",
       "               {'038079487X': 6.6},\n",
       "               {'0385505833': 6.4},\n",
       "               {'0676972152': 6.4},\n",
       "               {'0786867647': 6.4},\n",
       "               {'0060959037': 6.38},\n",
       "               {'0771099894': 6.25},\n",
       "               {'0812550706': 6.2},\n",
       "               {'0425122123': 6.2},\n",
       "               {'0446667900': 6.12},\n",
       "               {'0671011375': 6.0},\n",
       "               {'1550541129': 6.0}],\n",
       "              1: [],\n",
       "              2: [],\n",
       "              3: [{'0060915544': 8.43},\n",
       "               {'0140042393': 8.33},\n",
       "               {'0552137030': 8.29},\n",
       "               {'0836220889': 7.83},\n",
       "               {'0425105334': 7.8},\n",
       "               {'0836218256': 7.67},\n",
       "               {'0140277439': 7.6},\n",
       "               {'0345338588': 7.6},\n",
       "               {'1853260002': 7.5},\n",
       "               {'0060935464': 7.4},\n",
       "               {'0836218353': 7.2},\n",
       "               {'0671868691': 7.17},\n",
       "               {'0446532231': 7.15},\n",
       "               {'038542017X': 7.14},\n",
       "               {'0440224764': 7.0},\n",
       "               {'0770422578': 7.0},\n",
       "               {'0006485278': 7.0},\n",
       "               {'0451163524': 7.0},\n",
       "               {'0771060548': 6.89},\n",
       "               {'0553287893': 6.83}],\n",
       "              4: [{'0380718839': 8.4},\n",
       "               {'0316666343': 7.57},\n",
       "               {'0345370775': 7.0},\n",
       "               {'0684872153': 6.6},\n",
       "               {'0671758896': 6.2},\n",
       "               {'0676974805': 6.0},\n",
       "               {'0440213525': 5.57},\n",
       "               {'0515111279': 5.43},\n",
       "               {'034540288X': 5.29},\n",
       "               {'0676973094': 5.22},\n",
       "               {'0671027360': 5.2},\n",
       "               {'0684874350': 5.0}],\n",
       "              5: []},\n",
       "             'france': {0: [],\n",
       "              1: [],\n",
       "              2: [],\n",
       "              3: [{'2070370003': 9.0},\n",
       "               {'2070408507': 7.33},\n",
       "               {'2253140872': 7.14},\n",
       "               {'2266084372': 7.12},\n",
       "               {'2877302202': 6.8},\n",
       "               {'22530152730': 6.6},\n",
       "               {'2070744833': 6.57},\n",
       "               {'2253072079': 6.4},\n",
       "               {'2277260029': 6.4},\n",
       "               {'2290302155': 6.33},\n",
       "               {'2070363317': 6.2},\n",
       "               {'2253153265': 6.2},\n",
       "               {'2253144452': 6.17},\n",
       "               {'2264016124': 6.17},\n",
       "               {'2226135022': 6.12},\n",
       "               {'2020306492': 6.0},\n",
       "               {'2253154393': 6.0},\n",
       "               {'2290308285': 5.89},\n",
       "               {'2253150711': 5.71},\n",
       "               {'229030039X': 5.6}],\n",
       "              4: [],\n",
       "              5: []},\n",
       "             'germany': {0: [{'3518366823': 6.8},\n",
       "               {'3423072571': 6.2},\n",
       "               {'3518368540': 6.0},\n",
       "               {'3423203668': 5.33},\n",
       "               {'3426029553': 5.25},\n",
       "               {'3453007867': 5.17},\n",
       "               {'3404148665': 5.0}],\n",
       "              1: [],\n",
       "              2: [],\n",
       "              3: [{'3551551936': 9.6},\n",
       "               {'3551551693': 9.5},\n",
       "               {'3551551677': 9.5},\n",
       "               {'3423071516': 9.0},\n",
       "               {'3518372742': 8.0},\n",
       "               {'3257230478': 7.67},\n",
       "               {'3442727952': 7.43},\n",
       "               {'3442724686': 7.33},\n",
       "               {'3518100734': 7.33},\n",
       "               {'3596215226': 7.3},\n",
       "               {'3150000017': 7.14},\n",
       "               {'3426612704': 6.89},\n",
       "               {'3423205202': 6.88},\n",
       "               {'3499224615': 6.71},\n",
       "               {'3423202947': 6.7},\n",
       "               {'3442442354': 6.67},\n",
       "               {'3453071174': 6.6},\n",
       "               {'3551551685': 6.5},\n",
       "               {'3423204206': 6.44},\n",
       "               {'3518388762': 6.4}],\n",
       "              4: [],\n",
       "              5: []},\n",
       "             'italy': {0: [{'8806142100': 6.33},\n",
       "               {'8826703132': 6.08},\n",
       "               {'884590184X': 6.0},\n",
       "               {'8817131628': 5.2}],\n",
       "              2: [],\n",
       "              3: [{'8845205118': 7.67},\n",
       "               {'8807813823': 7.2},\n",
       "               {'8845915700': 7.17},\n",
       "               {'8817106259': 6.29},\n",
       "               {'8807701510': 6.2},\n",
       "               {'8807816067': 6.18},\n",
       "               {'881786983X': 6.0},\n",
       "               {'0743222229': 5.86},\n",
       "               {'8807817039': 5.83},\n",
       "               {'8807814684': 5.5},\n",
       "               {'8806161741': 5.4},\n",
       "               {'884541096X': 5.4},\n",
       "               {'8845290077': 5.29},\n",
       "               {'8817106100': 5.25},\n",
       "               {'0451164075': 5.2},\n",
       "               {'8807816059': 5.1},\n",
       "               {'8804342838': 5.09},\n",
       "               {'9770390107900': 5.0}],\n",
       "              4: [],\n",
       "              5: []},\n",
       "             'n/a': {0: [], 3: [], 4: []},\n",
       "             'other': {0: [{'8826703132': 9.0},\n",
       "               {'0060008024': 8.0},\n",
       "               {'0439064872': 7.38},\n",
       "               {'1558743669': 7.2},\n",
       "               {'0440211727': 7.0},\n",
       "               {'0330332775': 6.8},\n",
       "               {'0140298479': 6.67},\n",
       "               {'0380789019': 6.6},\n",
       "               {'034536676X': 6.5},\n",
       "               {'0446679593': 6.43},\n",
       "               {'0316693251': 6.4},\n",
       "               {'0316693006': 6.4},\n",
       "               {'1400034779': 6.23},\n",
       "               {'0345337662': 6.2},\n",
       "               {'0375706771': 6.2},\n",
       "               {'0385335881': 6.2},\n",
       "               {'0345339681': 6.17},\n",
       "               {'0553296981': 6.17},\n",
       "               {'044651652X': 6.12},\n",
       "               {'0062502182': 6.0}],\n",
       "              1: [],\n",
       "              2: [],\n",
       "              3: [{'0553296981': 9.38},\n",
       "               {'0441001971': 8.6},\n",
       "               {'0590353403': 8.5},\n",
       "               {'0671793489': 8.4},\n",
       "               {'0553213148': 7.6},\n",
       "               {'0515131229': 7.4},\n",
       "               {'0446310786': 7.3},\n",
       "               {'0439139597': 7.22},\n",
       "               {'0345378490': 7.2},\n",
       "               {'0747546290': 7.14},\n",
       "               {'0842329218': 7.14},\n",
       "               {'0312924585': 7.0},\n",
       "               {'3257228007': 6.86},\n",
       "               {'0786868716': 6.83},\n",
       "               {'051513628X': 6.8},\n",
       "               {'0151008116': 6.8},\n",
       "               {'0061092177': 6.8},\n",
       "               {'0375702709': 6.8},\n",
       "               {'0099800403': 6.5},\n",
       "               {'0439136350': 6.45}],\n",
       "              4: [],\n",
       "              5: []},\n",
       "             'portugal': {0: [],\n",
       "              1: [],\n",
       "              2: [],\n",
       "              3: [{'038082101X': 8.86},\n",
       "               {'0439139600': 7.33},\n",
       "               {'0380815923': 6.6},\n",
       "               {'006050918X': 6.4},\n",
       "               {'9505156944': 6.33},\n",
       "               {'0380977788': 5.86},\n",
       "               {'002542730X': 5.75},\n",
       "               {'0460877305': 5.71},\n",
       "               {'0385721234': 5.5},\n",
       "               {'0385413041': 5.4},\n",
       "               {'9726081378': 5.4},\n",
       "               {'0811214982': 5.3},\n",
       "               {'0330262130': 5.2},\n",
       "               {'0880381744': 5.2},\n",
       "               {'0552137030': 5.2},\n",
       "               {'9722113747': 5.17},\n",
       "               {'9580464162': 5.0},\n",
       "               {'9724614565': 5.0},\n",
       "               {'1401201385': 5.0}],\n",
       "              4: [],\n",
       "              5: []},\n",
       "             'spain': {0: [],\n",
       "              1: [],\n",
       "              2: [],\n",
       "              3: [{'8445071416': 8.69},\n",
       "               {'8420616893': 8.62},\n",
       "               {'8420613487': 8.6},\n",
       "               {'950491036X': 8.43},\n",
       "               {'8478886508': 8.4},\n",
       "               {'8478886451': 8.4},\n",
       "               {'0156013924': 7.8},\n",
       "               {'8408039369': 7.8},\n",
       "               {'8420636282': 7.6},\n",
       "               {'8495501074': 7.43},\n",
       "               {'8420432113': 7.2},\n",
       "               {'8440627203': 7.17},\n",
       "               {'8445071408': 7.0},\n",
       "               {'0452282152': 7.0},\n",
       "               {'9681501225': 7.0},\n",
       "               {'8445071769': 6.8},\n",
       "               {'8420466034': 6.8},\n",
       "               {'8445071394': 6.8},\n",
       "               {'8423309223': 6.62},\n",
       "               {'8433914545': 6.62}],\n",
       "              4: [{'8408043641': 6}],\n",
       "              5: []},\n",
       "             'united kingdom': {0: [{'0590660543': 6.33},\n",
       "               {'000649840X': 6.17},\n",
       "               {'0330367358': 6.0},\n",
       "               {'0330376519': 6.0},\n",
       "               {'1857027051': 6.0},\n",
       "               {'0749395990': 5.67},\n",
       "               {'0552124753': 5.6},\n",
       "               {'0099771519': 5.33},\n",
       "               {'0749399902': 5.0}],\n",
       "              1: [],\n",
       "              2: [],\n",
       "              3: [{'1844262553': 8.35},\n",
       "               {'0091891965': 8.2},\n",
       "               {'0140620117': 7.17},\n",
       "               {'0330258648': 7.0},\n",
       "               {'1860465811': 7.0},\n",
       "               {'1857231384': 7.0},\n",
       "               {'0552145424': 6.83},\n",
       "               {'0440206154': 6.67},\n",
       "               {'0552131059': 6.62},\n",
       "               {'0192833596': 6.6},\n",
       "               {'0440235596': 6.6},\n",
       "               {'0552142379': 6.5},\n",
       "               {'0330267388': 6.4},\n",
       "               {'0671024337': 6.4},\n",
       "               {'0380002930': 6.4},\n",
       "               {'0722532938': 6.38},\n",
       "               {'0552149519': 6.2},\n",
       "               {'0140287248': 6.17},\n",
       "               {'0380813815': 6.17},\n",
       "               {'0064407667': 6.12}],\n",
       "              4: [{'1844262553': 8.5},\n",
       "               {'0552147680': 6.6},\n",
       "               {'0552131067': 5.8},\n",
       "               {'0552996181': 5.0}],\n",
       "              5: []},\n",
       "             'usa': {0: [{'0156004801': 9.6},\n",
       "               {'0060256672': 9.33},\n",
       "               {'0971942315': 9.0},\n",
       "               {'1576738167': 9.0},\n",
       "               {'0553351397': 8.83},\n",
       "               {'0441002935': 8.6},\n",
       "               {'0615116426': 8.45},\n",
       "               {'0316735027': 8.33},\n",
       "               {'0140309578': 8.33},\n",
       "               {'0140185232': 8.2},\n",
       "               {'0553148001': 8.17},\n",
       "               {'0395977894': 8.1},\n",
       "               {'0743455967': 8.0},\n",
       "               {'0618002235': 8.0},\n",
       "               {'039480029X': 8.0},\n",
       "               {'0877738513': 8.0},\n",
       "               {'0060248025': 8.0},\n",
       "               {'0807083054': 7.89},\n",
       "               {'0553380958': 7.8},\n",
       "               {'0553213504': 7.8}],\n",
       "              1: [{'0064407667': 9.6},\n",
       "               {'0439064872': 8.0},\n",
       "               {'059035342X': 7.33}],\n",
       "              2: [{'0590353403': 9.44},\n",
       "               {'0440237688': 9.4},\n",
       "               {'0451191137': 8.8},\n",
       "               {'0439139597': 8.36},\n",
       "               {'0679886370': 8.17},\n",
       "               {'0140348107': 8.0},\n",
       "               {'0064472272': 7.71},\n",
       "               {'0439064864': 7.67},\n",
       "               {'0671027344': 7.64},\n",
       "               {'0446608955': 7.56},\n",
       "               {'0394820371': 7.43},\n",
       "               {'0385729332': 7.33},\n",
       "               {'0316666343': 7.29},\n",
       "               {'0385729340': 7.2},\n",
       "               {'0385730586': 7.0},\n",
       "               {'043935806X': 6.62},\n",
       "               {'0439136350': 6.6},\n",
       "               {'1576738159': 6.6},\n",
       "               {'0440439884': 6.4},\n",
       "               {'0345342968': 6.33}],\n",
       "              3: [{'0066238501': 9.88},\n",
       "               {'0517693119': 9.83},\n",
       "               {'0394800389': 9.83},\n",
       "               {'0920668364': 9.67},\n",
       "               {'0395177111': 9.5},\n",
       "               {'0890876789': 9.4},\n",
       "               {'0898159954': 9.4},\n",
       "               {'0316286850': 9.4},\n",
       "               {'0375503803': 9.2},\n",
       "               {'0316779059': 9.0},\n",
       "               {'156402976X': 9.0},\n",
       "               {'0553110845': 9.0},\n",
       "               {'0060256737': 8.83},\n",
       "               {'0060968966': 8.8},\n",
       "               {'0670451932': 8.8},\n",
       "               {'0805013407': 8.6},\n",
       "               {'0060961325': 8.6},\n",
       "               {'0140195831': 8.6},\n",
       "               {'0451525663': 8.6},\n",
       "               {'0451171926': 8.4}],\n",
       "              4: [{'0312303467': 9.4},\n",
       "               {'0060514957': 9.0},\n",
       "               {'0553377868': 8.86},\n",
       "               {'0688167888': 8.4},\n",
       "               {'0399151451': 8.0},\n",
       "               {'1579546463': 8.0},\n",
       "               {'0380977311': 7.86},\n",
       "               {'0553379615': 7.83},\n",
       "               {'0943233828': 7.8},\n",
       "               {'0446532452': 7.57},\n",
       "               {'0553565079': 7.4},\n",
       "               {'0066214769': 7.4},\n",
       "               {'0446322180': 7.29},\n",
       "               {'0439064864': 7.22},\n",
       "               {'0399151613': 7.2},\n",
       "               {'0449911519': 7.2},\n",
       "               {'0451169514': 7.17},\n",
       "               {'0553802461': 7.12},\n",
       "               {'0312983220': 7.0},\n",
       "               {'0312983301': 7.0}],\n",
       "              5: [{'0440234743': 7.6}, {'044022165X': 6.4}]}})"
      ]
     },
     "execution_count": 127,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "feature_recommand_with_rating"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 找到热门商品"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 128,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['0971880107',\n",
       " '0316666343',\n",
       " '0385504209',\n",
       " '0312195516',\n",
       " '0060928336',\n",
       " '0679781587',\n",
       " '044023722X',\n",
       " '0142001740',\n",
       " '0316601950',\n",
       " '0671027360',\n",
       " '0446672211',\n",
       " '067976402X',\n",
       " '0375727345',\n",
       " '059035342X',\n",
       " '0440214041',\n",
       " '0452282152',\n",
       " '044021145X',\n",
       " '0440211727',\n",
       " '0345337662',\n",
       " '0804106304',\n",
       " '0440226430',\n",
       " '0156027321',\n",
       " '0060976845',\n",
       " '0060930535',\n",
       " '0440241073',\n",
       " '0345370775',\n",
       " '0671003755',\n",
       " '0743418174',\n",
       " '0671021001',\n",
       " '0312278586',\n",
       " '0446605239',\n",
       " '0786868716',\n",
       " '1400034779',\n",
       " '0440222656',\n",
       " '0440234743',\n",
       " '0345361792',\n",
       " '0440221471',\n",
       " '0440236673',\n",
       " '0316769487',\n",
       " '0385484518',\n",
       " '044022165X',\n",
       " '0345353145',\n",
       " '0345417623',\n",
       " '0440206154',\n",
       " '0446310786',\n",
       " '0375706771',\n",
       " '0060502258',\n",
       " '0446606812',\n",
       " '0446610038',\n",
       " '044651652X',\n",
       " '0440220602',\n",
       " '0440225701',\n",
       " '0439064872',\n",
       " '0440213525',\n",
       " '0345443284',\n",
       " '0671510053',\n",
       " '0140293248',\n",
       " '0060934417',\n",
       " '0385335482',\n",
       " '0452282829',\n",
       " '006101351X',\n",
       " '0375726403',\n",
       " '0375707972',\n",
       " '0440224764',\n",
       " '0316284955',\n",
       " '043935806X',\n",
       " '0316776963',\n",
       " '0312291639',\n",
       " '0385492081',\n",
       " '0385720106',\n",
       " '0345342968',\n",
       " '0385265700',\n",
       " '0684872153',\n",
       " '0380789035',\n",
       " '0375700757',\n",
       " '0060938455',\n",
       " '0375725784',\n",
       " '0553572997',\n",
       " '068484477X',\n",
       " '0842329129',\n",
       " '0316096199',\n",
       " '0385722206',\n",
       " '0061009059',\n",
       " '0312305060',\n",
       " '0060987103',\n",
       " '0553279912',\n",
       " '0440224675',\n",
       " '0345378490',\n",
       " '0671001795',\n",
       " '0142000205',\n",
       " '0345351525',\n",
       " '0446364193',\n",
       " '0684874350',\n",
       " '0060392452',\n",
       " '0345339681',\n",
       " '0446608955',\n",
       " '0743237188',\n",
       " '0316569321',\n",
       " '0446612545',\n",
       " '0446611867',\n",
       " '0345313860',\n",
       " '0515131229',\n",
       " '0440235596',\n",
       " '0805063897',\n",
       " '014028009X',\n",
       " '0449212602',\n",
       " '0380731851',\n",
       " '0345339703',\n",
       " '0553268880',\n",
       " '0345391055',\n",
       " '1558743669',\n",
       " '0671027387',\n",
       " '051513287X',\n",
       " '0679746048',\n",
       " '0440226104',\n",
       " '080410753X',\n",
       " '0345387651',\n",
       " '0380730138',\n",
       " '0446611212',\n",
       " '0679429220',\n",
       " '0804114986',\n",
       " '0345380371',\n",
       " '0385486804',\n",
       " '0380002930',\n",
       " '0060915544',\n",
       " '0060959037',\n",
       " '0425175405',\n",
       " '0399501487',\n",
       " '0786881852',\n",
       " '0064407667',\n",
       " '0440241537',\n",
       " '0446605484',\n",
       " '0312983271',\n",
       " '0446607657',\n",
       " '0345384466',\n",
       " '080410526X',\n",
       " '0553582755',\n",
       " '0312924585',\n",
       " '034540288X',\n",
       " '0553280341',\n",
       " '0060987529',\n",
       " '0451166892',\n",
       " '0380789019',\n",
       " '0312966091',\n",
       " '0425167313',\n",
       " '014025448X',\n",
       " '0140298479',\n",
       " '0062502182',\n",
       " '0439136369',\n",
       " '0449005615',\n",
       " '0140244824',\n",
       " '0679745203',\n",
       " '0425152251',\n",
       " '074343627X',\n",
       " '0425180638',\n",
       " '0380018179',\n",
       " '080411109X',\n",
       " '0425147622',\n",
       " '0060987561',\n",
       " '0425154092',\n",
       " '0446601241',\n",
       " '0070212570',\n",
       " '0440211263',\n",
       " '068484267X',\n",
       " '0446612790',\n",
       " '0060977493',\n",
       " '0449003795',\n",
       " '0515132020',\n",
       " '0671041789',\n",
       " '0743225406',\n",
       " '0061097101',\n",
       " '038079487X',\n",
       " '080411868X',\n",
       " '1573229326',\n",
       " '0385508042',\n",
       " '0312966970',\n",
       " '0385505833',\n",
       " '0871136791',\n",
       " '0425158616',\n",
       " '0671038184',\n",
       " '0345402871',\n",
       " '0767902521',\n",
       " '0312995423',\n",
       " '0609804138',\n",
       " '0312971346',\n",
       " '0451524934',\n",
       " '155874262X',\n",
       " '0553250426',\n",
       " '0425162443',\n",
       " '0385479565',\n",
       " '0812550706',\n",
       " '0345439104',\n",
       " '1400031354',\n",
       " '0440236703',\n",
       " '0141000198',\n",
       " '067102423X',\n",
       " '0385335881',\n",
       " '0312980140',\n",
       " '0449907481',\n",
       " '0446359866',\n",
       " '0671042858',\n",
       " '0380718340',\n",
       " '0440212561',\n",
       " '0425182908',\n",
       " '0767905180',\n",
       " '0375703055',\n",
       " '038550120X',\n",
       " '0425169863',\n",
       " '0316781266',\n",
       " '1559029838',\n",
       " '0385503822',\n",
       " '0553260111',\n",
       " '014023313X',\n",
       " '0380718332',\n",
       " '0553580221',\n",
       " '014029628X',\n",
       " '0066214122',\n",
       " '0451183665',\n",
       " '0316899984',\n",
       " '0671024248',\n",
       " '0312282990',\n",
       " '0553579606',\n",
       " '0375702709',\n",
       " '0439139597',\n",
       " '0743436210',\n",
       " '0439139600',\n",
       " '0451184963',\n",
       " '0671004530',\n",
       " '0441569595',\n",
       " '1573225789',\n",
       " '034538475X',\n",
       " '0345438329',\n",
       " '0446670251',\n",
       " '0553279378',\n",
       " '0671014196',\n",
       " '0446532231',\n",
       " '0553277472',\n",
       " '0439136350',\n",
       " '042511774X',\n",
       " '0515132187',\n",
       " '0446610399',\n",
       " '0140067477',\n",
       " '044651862X',\n",
       " '0590353403',\n",
       " '0451203771',\n",
       " '042516098X',\n",
       " '038572179X',\n",
       " '0671867156',\n",
       " '0316780375',\n",
       " '0425163407',\n",
       " '0375703861',\n",
       " '0399144463',\n",
       " '0440180295',\n",
       " '0446604801',\n",
       " '0452264464',\n",
       " '0312976275',\n",
       " '0515126772',\n",
       " '034541389X',\n",
       " '0142001430',\n",
       " '0553280368',\n",
       " '0345339738',\n",
       " '0553275976',\n",
       " '0345465083',\n",
       " '0060175400',\n",
       " '0671758896',\n",
       " '0446606189',\n",
       " '0449221504',\n",
       " '0449003787',\n",
       " '0316969443',\n",
       " '0345350499',\n",
       " '0440224624',\n",
       " '0140119906',\n",
       " '0515128554',\n",
       " '0345413903',\n",
       " '0767900383',\n",
       " '0345348036',\n",
       " '0553272535',\n",
       " '0385498802',\n",
       " '0446607711',\n",
       " '0842329218',\n",
       " '0671004573',\n",
       " '055356451X',\n",
       " '0345339711',\n",
       " '0142001805',\n",
       " '0425147584',\n",
       " '0515130389',\n",
       " '0385336179',\n",
       " '0061015725',\n",
       " '002542730X',\n",
       " '0441003257',\n",
       " '0446516538',\n",
       " '0425116840',\n",
       " '0451156609',\n",
       " '0099771519',\n",
       " '0553375407',\n",
       " '0684801523',\n",
       " '0060391626',\n",
       " '0440235162',\n",
       " '0684848783',\n",
       " '0446608815',\n",
       " '140003065X',\n",
       " '0439064864',\n",
       " '0060921145',\n",
       " '0553279556',\n",
       " '031298328X',\n",
       " '0312421273',\n",
       " '0385721420',\n",
       " '0804111359',\n",
       " '0446394521',\n",
       " '0743227441',\n",
       " '0451167317',\n",
       " '042510107X',\n",
       " '0440219078',\n",
       " '0553271636',\n",
       " '0553579754',\n",
       " '0425083837',\n",
       " '0451526341',\n",
       " '0425143325',\n",
       " '0449221512',\n",
       " '067088300X',\n",
       " '0345413350',\n",
       " '0553582747',\n",
       " '0312980159',\n",
       " '0449219364',\n",
       " '0553284789',\n",
       " '0385474016',\n",
       " '0425133540',\n",
       " '0553574574',\n",
       " '0749397543',\n",
       " '0553582526',\n",
       " '0446610100',\n",
       " '0440498058',\n",
       " '0441172717',\n",
       " '0451203895',\n",
       " '0525947647',\n",
       " '0312243022',\n",
       " '006016848X',\n",
       " '0380813815',\n",
       " '0151008116',\n",
       " '044022103X',\n",
       " '0312983867',\n",
       " '0375703063',\n",
       " '0451172817',\n",
       " '0553578693',\n",
       " '0553582135',\n",
       " '0385720955',\n",
       " '0671617028',\n",
       " '0671727796',\n",
       " '0440414806',\n",
       " '014100018X',\n",
       " '0385497466',\n",
       " '0449221482',\n",
       " '0449223612',\n",
       " '0786817070',\n",
       " '0316969680',\n",
       " '0671004107',\n",
       " '0375705856',\n",
       " '0446606324',\n",
       " '1558745157',\n",
       " '0375502238',\n",
       " '0446604666',\n",
       " '0440223202',\n",
       " '031242227X',\n",
       " '0345378482',\n",
       " '0449223604',\n",
       " '037570504X',\n",
       " '0671011367',\n",
       " '0425115801',\n",
       " '0440998050',\n",
       " '0446679593',\n",
       " '0425109720',\n",
       " '0515128546',\n",
       " '0743412028',\n",
       " '0449221490',\n",
       " '0446360589',\n",
       " '0812511816',\n",
       " '038550926X',\n",
       " '0449219461',\n",
       " '0553296981',\n",
       " '0451177096',\n",
       " '0440221595',\n",
       " '0671028375',\n",
       " '0553273914',\n",
       " '0425144429',\n",
       " '0671793489',\n",
       " '042513525X',\n",
       " '0446611808',\n",
       " '0553571885',\n",
       " '0061097314',\n",
       " '051513628X',\n",
       " '0670865796',\n",
       " '0060958022',\n",
       " '0425182878',\n",
       " '0425172546',\n",
       " '0553289411',\n",
       " '0671888587',\n",
       " '0316089699',\n",
       " '0440224594',\n",
       " '0345368754',\n",
       " '0425147363',\n",
       " '0679744398',\n",
       " '0553250531',\n",
       " '038082101X',\n",
       " '0446531332',\n",
       " '0767905385',\n",
       " '0385511612',\n",
       " '0553292722',\n",
       " '0345427637',\n",
       " '0671004565',\n",
       " '0679751521',\n",
       " '0451202341',\n",
       " '0345447840',\n",
       " '038549081X',\n",
       " '0373218397',\n",
       " '089480829X',\n",
       " '0671042262',\n",
       " '0446603589',\n",
       " '1558744150',\n",
       " '0345391802',\n",
       " '0312990456',\n",
       " '0399150897',\n",
       " '0312422156',\n",
       " '0380710218',\n",
       " '0345370805',\n",
       " '0671004549',\n",
       " '0671894455',\n",
       " '0786885688',\n",
       " '0679731148',\n",
       " '0440213290',\n",
       " '0446611085',\n",
       " '0446609404',\n",
       " '0312265867',\n",
       " '0452283205',\n",
       " '0156628708',\n",
       " '0446364800',\n",
       " '0679735909',\n",
       " '0743206045',\n",
       " '0671673688',\n",
       " '0345384369',\n",
       " '0425122123',\n",
       " '0671867113',\n",
       " '0743411250',\n",
       " '0743418204',\n",
       " '055321313X',\n",
       " '0452260116',\n",
       " '0375506039',\n",
       " '0451160525',\n",
       " '0670892963',\n",
       " '0515121843',\n",
       " '0440202043',\n",
       " '0671708635',\n",
       " '0312983824',\n",
       " '0553582127',\n",
       " '0743460529',\n",
       " '0375727132',\n",
       " '0671867172',\n",
       " '0452269571',\n",
       " '0553564528',\n",
       " '0802130208',\n",
       " '0425180964',\n",
       " '0385420161',\n",
       " '0345435168',\n",
       " '039592720X',\n",
       " '0446603716',\n",
       " '1878424319',\n",
       " '0670880728',\n",
       " '0441790348',\n",
       " '0842342702',\n",
       " '0345446860',\n",
       " '0316789089',\n",
       " '0670894184',\n",
       " '0786867647',\n",
       " '0345369947',\n",
       " '0399147195',\n",
       " '0671568175',\n",
       " '0373218192',\n",
       " '0553561618',\n",
       " '0743224574',\n",
       " '0553573136',\n",
       " '1558744630',\n",
       " '0452284449',\n",
       " '0385424728',\n",
       " '051512608X',\n",
       " '0425170349',\n",
       " '0553569910',\n",
       " '0374129983',\n",
       " '0515135062',\n",
       " '038533334X',\n",
       " '0385730586',\n",
       " '0330332775',\n",
       " '0446611778',\n",
       " '0425124347',\n",
       " '055356160X',\n",
       " '0451186362',\n",
       " '0060173289',\n",
       " '0743467523',\n",
       " '0375760911',\n",
       " '0345424719',\n",
       " '0553581554',\n",
       " '0440215625',\n",
       " '0446608890',\n",
       " '0385502532',\n",
       " '0345386108',\n",
       " '0452280621',\n",
       " '0671042572',\n",
       " '0064407675',\n",
       " '0060929871',\n",
       " '0425107469',\n",
       " '0373218036',\n",
       " '0451176464',\n",
       " '0394820371',\n",
       " '0140177396',\n",
       " '0451181379',\n",
       " '0515127833',\n",
       " '0380730847',\n",
       " '0449227421',\n",
       " '0679444815',\n",
       " '0552124753',\n",
       " '0743211383',\n",
       " '0449006522',\n",
       " '0553582143',\n",
       " '0451169530',\n",
       " '0316781010',\n",
       " '0380012863',\n",
       " '0743437640',\n",
       " '0060922532',\n",
       " '0316666009',\n",
       " '0064472272',\n",
       " '0375412824',\n",
       " '0802139256',\n",
       " '0679772677',\n",
       " '0515136530',\n",
       " '0446520802',\n",
       " '0842329242',\n",
       " '038529929X',\n",
       " '0385472951',\n",
       " '0385490992',\n",
       " '0425178765',\n",
       " '0316788228',\n",
       " '0380717018',\n",
       " '0743211375',\n",
       " '0060199652',\n",
       " '0345384350',\n",
       " '0345413881',\n",
       " '0316693006',\n",
       " '0553578022',\n",
       " '0553580191',\n",
       " '0446675059',\n",
       " '1400031362',\n",
       " '0515133973',\n",
       " '0446607193',\n",
       " '0451204530',\n",
       " '0312265859',\n",
       " '006019491X',\n",
       " '0345413873',\n",
       " '0064400557',\n",
       " '0515122734',\n",
       " '0446610542',\n",
       " '038542471X',\n",
       " '0446613266',\n",
       " '0440218535',\n",
       " '0399149325',\n",
       " '0671867091',\n",
       " '0684865742',\n",
       " '0345436911',\n",
       " '0316782505',\n",
       " '0425184226',\n",
       " '0679446486',\n",
       " '0553569155',\n",
       " '042513699X',\n",
       " '0425158632',\n",
       " '0679734775',\n",
       " '0316602906',\n",
       " '0452282195',\n",
       " '0451207521',\n",
       " '0316693200',\n",
       " '0671693816',\n",
       " '0385510438',\n",
       " '0316693235',\n",
       " '0385493800',\n",
       " '0399146431',\n",
       " '0380977788',\n",
       " '0140254544',\n",
       " '0515133302',\n",
       " '0440122090',\n",
       " '0743457358',\n",
       " '0451205421',\n",
       " '0316777730',\n",
       " '0060096195',\n",
       " '0399149155',\n",
       " '0316168688',\n",
       " '0425155404',\n",
       " '034538184X',\n",
       " '034536676X',\n",
       " '0515136379',\n",
       " '0345444884',\n",
       " '0316781142',\n",
       " '0451163966',\n",
       " '038542017X',\n",
       " '0804115761',\n",
       " '1592400876',\n",
       " '0425153975',\n",
       " '0399145087',\n",
       " '0553282476',\n",
       " '0449134482',\n",
       " '0446609323',\n",
       " '0743203631',\n",
       " '0425132951',\n",
       " '0688177751',\n",
       " '0684867621',\n",
       " '0553274295',\n",
       " '1573225517',\n",
       " '0091867770',\n",
       " '0553560247',\n",
       " '0142004235',\n",
       " '0451206525',\n",
       " '0671880314',\n",
       " '0446519138',\n",
       " '0373484224',\n",
       " '0552998486',\n",
       " '080213825X',\n",
       " '0767915054',\n",
       " '0446365505',\n",
       " '034543479X',\n",
       " '0399146253',\n",
       " '0553213148',\n",
       " '0380820293',\n",
       " '034539657X',\n",
       " '0375706410',\n",
       " '0312144075',\n",
       " '0671683993',\n",
       " '0060932759',\n",
       " '0446605409',\n",
       " '0375500510',\n",
       " '0345354613',\n",
       " '0451169522',\n",
       " '0316182540',\n",
       " '1573229571',\n",
       " '0425174271',\n",
       " '0553572326',\n",
       " '0312971125',\n",
       " '0316777722',\n",
       " '0345422317',\n",
       " '006099486X',\n",
       " '0425192733',\n",
       " '0451153553',\n",
       " '0330375253',\n",
       " '042518630X',\n",
       " '0060008032',\n",
       " '0425136981',\n",
       " '0451208765',\n",
       " '0373825013',\n",
       " '080411935X',\n",
       " '0425092917',\n",
       " '0609610597',\n",
       " '0553576801',\n",
       " '0345404114',\n",
       " '0515130966',\n",
       " '0671727583',\n",
       " '0425177173',\n",
       " '0385335830',\n",
       " '0671027662',\n",
       " '0312306326',\n",
       " '1551668998',\n",
       " '0060916508',\n",
       " '0684833395',\n",
       " '051511992X',\n",
       " '0515124214',\n",
       " '1576737330',\n",
       " '0804105820',\n",
       " '0156006529',\n",
       " '0385512104',\n",
       " '0679442790',\n",
       " '0425192725',\n",
       " '067101420X',\n",
       " '0446606383',\n",
       " '0380727501',\n",
       " '0451180232',\n",
       " '0061020710',\n",
       " '0374199698',\n",
       " '067976397X',\n",
       " '0140179836',\n",
       " '0553265741',\n",
       " '0316602051',\n",
       " '0553569058',\n",
       " '0440200989',\n",
       " '0060512822',\n",
       " '0446525502',\n",
       " '0440241162',\n",
       " '0373218400',\n",
       " '0446602620',\n",
       " '0451197747',\n",
       " '0451170385',\n",
       " '0449912558',\n",
       " '0446603929',\n",
       " '0842329250',\n",
       " '1573227331',\n",
       " '0553580930',\n",
       " '0345348109',\n",
       " '0345445848',\n",
       " '0345441036',\n",
       " '0425151867',\n",
       " '0679735771',\n",
       " '0446667900',\n",
       " '0553571818',\n",
       " '0553274503',\n",
       " '0553583441',\n",
       " '0894805770',\n",
       " '0312982518',\n",
       " '1400031346',\n",
       " '0373484003',\n",
       " '0688177859',\n",
       " '0425147517',\n",
       " '0671027581',\n",
       " '0446670111',\n",
       " '0743437802',\n",
       " '0385424736',\n",
       " '0446530522',\n",
       " '0446363251',\n",
       " '051512317X',\n",
       " '0425185710',\n",
       " '0671011375',\n",
       " '0515120618',\n",
       " '0451188454',\n",
       " '0452268060',\n",
       " '0743206029',\n",
       " '043936213X',\n",
       " '0553280414',\n",
       " '076790592X',\n",
       " '0312244266',\n",
       " '0887307876',\n",
       " '0449910237',\n",
       " '0345314255',\n",
       " '0385475721',\n",
       " '0312274920',\n",
       " '042517736X',\n",
       " '0425150143',\n",
       " '0380814021',\n",
       " '080411918X',\n",
       " '0345422384',\n",
       " '0446525537',\n",
       " '0316678104',\n",
       " '0451188462',\n",
       " '0425178102',\n",
       " '0804108749',\n",
       " '0425178579',\n",
       " '034538430X',\n",
       " '0345416260',\n",
       " '0451191145',\n",
       " '0345413865',\n",
       " '0380817691',\n",
       " '0345366239',\n",
       " '0671741195',\n",
       " '044661064X',\n",
       " '0385503954',\n",
       " '0345397819',\n",
       " '0671027344',\n",
       " '0451209907',\n",
       " '081297106X',\n",
       " '0449203794',\n",
       " '0743235150',\n",
       " '0786866586',\n",
       " '0425166619',\n",
       " '0345354621',\n",
       " '0671537458',\n",
       " '0140042598',\n",
       " '0345413369',\n",
       " '0425142485',\n",
       " '0425119653',\n",
       " '0440217490',\n",
       " '0671014919',\n",
       " '0380710722',\n",
       " '1558745718',\n",
       " '1400032717',\n",
       " '0375504397',\n",
       " '0374100128',\n",
       " '0312924801',\n",
       " '0446350982',\n",
       " '0786889020',\n",
       " '0743439740',\n",
       " '0425189864',\n",
       " '0515135739',\n",
       " '0385720920',\n",
       " '0425121631',\n",
       " '0452281903',\n",
       " '0671038443',\n",
       " '0671525743',\n",
       " '0425161242',\n",
       " '0446604844',\n",
       " '0451169514',\n",
       " '0312966806',\n",
       " '0385508417',\n",
       " '0316693251',\n",
       " '0425145638',\n",
       " '0553295977',\n",
       " '055357230X',\n",
       " '0425172996',\n",
       " '0375413634',\n",
       " '0671701231',\n",
       " '0316603287',\n",
       " '0312986343',\n",
       " '0440225825',\n",
       " '0375412530',\n",
       " '0140092323',\n",
       " '0060926317',\n",
       " '067169507X',\n",
       " '0316693286',\n",
       " '0679731725',\n",
       " '0425140032',\n",
       " '0425130711',\n",
       " '0684862719',\n",
       " '0446365386',\n",
       " '0671026011',\n",
       " '0446605581',\n",
       " '0679723161',\n",
       " '0670030643',\n",
       " '0449911519',\n",
       " '0446604232',\n",
       " '0425157539',\n",
       " '0440940001',\n",
       " '0312263120',\n",
       " '0525946829',\n",
       " '0743418131',\n",
       " '0553263226',\n",
       " '0451186923',\n",
       " '0446527785',\n",
       " '0440217563',\n",
       " '0425179613',\n",
       " '042510687X',\n",
       " '0312978383',\n",
       " '1573229725',\n",
       " '0671743058',\n",
       " '0553584510',\n",
       " '0099387913',\n",
       " '0425167720',\n",
       " '0553258001',\n",
       " '015100692X',\n",
       " '034540761X',\n",
       " '0345404769',\n",
       " '0553582763',\n",
       " '0446604275',\n",
       " '0312983298',\n",
       " '0451142934',\n",
       " '006092988X',\n",
       " '0446356832',\n",
       " '0671028367',\n",
       " '0312974256',\n",
       " '0805059555',\n",
       " '0671886665',\n",
       " '0385503857',\n",
       " '044661193X',\n",
       " '0425189031',\n",
       " '0451166582',\n",
       " '067697175X',\n",
       " '0679457526',\n",
       " '042518286X',\n",
       " '0679439382',\n",
       " '0446523569',\n",
       " '0446608262',\n",
       " '0425179885',\n",
       " '1558531025',\n",
       " '0312201656',\n",
       " '0060740450',\n",
       " '0425181103',\n",
       " '000649840X',\n",
       " '0345392825',\n",
       " '0671670689',\n",
       " '0553582658',\n",
       " '0156028778',\n",
       " '0767916069',\n",
       " '0373484232',\n",
       " '0373243286',\n",
       " '0312952716',\n",
       " '1565122968',\n",
       " '0553572210',\n",
       " '0553213172',\n",
       " '0440236738',\n",
       " '0689817851',\n",
       " '0345386132',\n",
       " '0805019375',\n",
       " '0812570944',\n",
       " '0553210092',\n",
       " '0553212583',\n",
       " '0440201926',\n",
       " '0671024094',\n",
       " '0425121259',\n",
       " '0440211891',\n",
       " '0679720200',\n",
       " '0373244487',\n",
       " '067100042X',\n",
       " '0515087122',\n",
       " '0451163524',\n",
       " '0671250671',\n",
       " '0671034022',\n",
       " '0553583468',\n",
       " '0028604199',\n",
       " '0670894605',\n",
       " '0446673544',\n",
       " '0425151875',\n",
       " '0440204194',\n",
       " '0345447867',\n",
       " '0553278029',\n",
       " '0440221315',\n",
       " '0553573403',\n",
       " '0743469801',\n",
       " '0440236053',\n",
       " '0812543262',\n",
       " '0743417682',\n",
       " '0767905202',\n",
       " '0553578316',\n",
       " '0441005489',\n",
       " '0156007479',\n",
       " '0060964049',\n",
       " '0451151259',\n",
       " '0316693324',\n",
       " '006109921X',\n",
       " '0425118703',\n",
       " '0671023616',\n",
       " '0345384377',\n",
       " '0553211404',\n",
       " '0375705198',\n",
       " '0064471047',\n",
       " '0590660543',\n",
       " '0380703882',\n",
       " '0671776134',\n",
       " '0446353205',\n",
       " '0330262130',\n",
       " '0385494246',\n",
       " '0440224705',\n",
       " '0553208845',\n",
       " '0786862564',\n",
       " '0316690619',\n",
       " '0060930187',\n",
       " '0061098795',\n",
       " '0425152898',\n",
       " '0385490445',\n",
       " '0425162788',\n",
       " '0375703764',\n",
       " '0553586122',\n",
       " '0345452569',\n",
       " '0805062971',\n",
       " '0385509456',\n",
       " '0671028383',\n",
       " '0446607207',\n",
       " '0399143947',\n",
       " '0142002267',\n",
       " '0060188731',\n",
       " '8873122933',\n",
       " '0375414053',\n",
       " '0684857820',\n",
       " '0345441133',\n",
       " '0385314698',\n",
       " '0446527165',\n",
       " '0553578308',\n",
       " '0061000175',\n",
       " '0373484410',\n",
       " '055356773X',\n",
       " '0553579983',\n",
       " '0373484429',\n",
       " '0451203593',\n",
       " '0451191013',\n",
       " '0552137030',\n",
       " '0671741187',\n",
       " '0679419462',\n",
       " '0373483694',\n",
       " '0425169693',\n",
       " '155166674X',\n",
       " '0380600129',\n",
       " '0786890436',\n",
       " '0440176484',\n",
       " '0446611476',\n",
       " '0345396936',\n",
       " '0345389964',\n",
       " '0440207622',\n",
       " '0679742298',\n",
       " '0671729411',\n",
       " '0425161722',\n",
       " '0446604402',\n",
       " '0451190491',\n",
       " '1857022424',\n",
       " '0385482388',\n",
       " '0385315236',\n",
       " '0515118656',\n",
       " '0446530077',\n",
       " '0515132136',\n",
       " '0061000043',\n",
       " '0671002481',\n",
       " '0553583980',\n",
       " '0439404371',\n",
       " '0805036504',\n",
       " '0671695126',\n",
       " '0446613843',\n",
       " '0451155750',\n",
       " '0446602612',\n",
       " '0552996181',\n",
       " '0375400117',\n",
       " '0061031992',\n",
       " '0440220424',\n",
       " '0099245027',\n",
       " '0446601640',\n",
       " ...]"
      ]
     },
     "execution_count": 128,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "top2000_item_id_s = df_data_training['item_id'].value_counts()[:2000].index.tolist()\n",
    "top2000_item_id_s"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 130,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "      <th>item_id</th>\n",
       "      <th>rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>20</th>\n",
       "      <td>9</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "      <td>0440234743</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>21</th>\n",
       "      <td>9</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "      <td>0452264464</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>29</th>\n",
       "      <td>14</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "      <td>0971880107</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>30</th>\n",
       "      <td>16</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "      <td>0345402871</td>\n",
       "      <td>9</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>31</th>\n",
       "      <td>16</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "      <td>0345417623</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    user_id location  age     item_id  rating\n",
       "20        9      usa    0  0440234743       0\n",
       "21        9      usa    0  0452264464       6\n",
       "29       14      usa    0  0971880107       0\n",
       "30       16      usa    0  0345402871       9\n",
       "31       16      usa    0  0345417623       0"
      ]
     },
     "execution_count": 130,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_data_training_top2000 = df_data_training[\n",
    "    df_data_training['item_id'].isin(top2000_item_id_s)\n",
    "]\n",
    "df_data_training_top2000.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 132,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['1844262553',\n",
       " '0439139597',\n",
       " '0439136350',\n",
       " '0439064864',\n",
       " '0877017883',\n",
       " '0618002227',\n",
       " '0590353403',\n",
       " '0671027344',\n",
       " '0385199570',\n",
       " '0771060548',\n",
       " '0156528207',\n",
       " '0618129022',\n",
       " '0552128481',\n",
       " '0552131059',\n",
       " '0811801802',\n",
       " '0670032379',\n",
       " '0812550706',\n",
       " '0375756981',\n",
       " '0670894605',\n",
       " '0811825558']"
      ]
     },
     "execution_count": 132,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "top20_item_id_s = df_data_training_top2000.groupby('item_id')['rating'].mean().sort_values(ascending=False)[:20].index.tolist()\n",
    "top20_item_id_s"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 133,
   "metadata": {},
   "outputs": [],
   "source": [
    "for location in feature_recommand.keys():\n",
    "    for age in feature_recommand[location].keys():\n",
    "        feature_recommand_len = len(feature_recommand[location][age])\n",
    "        feature_recommand[location][age] += top20_item_id_s[:20-feature_recommand_len]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 134,
   "metadata": {},
   "outputs": [],
   "source": [
    "cPickle.dump(feature_recommand,open('./data/feature_recommand.pkl','wb'))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 读取推荐列表"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 135,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "defaultdict(dict,\n",
       "            {'australia': {0: ['0099771519',\n",
       "               '1857022424',\n",
       "               '1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981'],\n",
       "              1: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              2: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              3: ['0552998486',\n",
       "               '015602943X',\n",
       "               '0552140295',\n",
       "               '0440220602',\n",
       "               '0446532231',\n",
       "               '0007170866',\n",
       "               '1875989218',\n",
       "               '0099727412',\n",
       "               '0860074382',\n",
       "               '0140008535',\n",
       "               '0385335482',\n",
       "               '0553279556',\n",
       "               '1400034779',\n",
       "               '0743225082',\n",
       "               '0949206318',\n",
       "               '1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883'],\n",
       "              4: ['0091867770',\n",
       "               '1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605'],\n",
       "              5: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558']},\n",
       "             'canada': {0: ['0140505865',\n",
       "               '0140067477',\n",
       "               '076790592X',\n",
       "               '0553250426',\n",
       "               '0060392452',\n",
       "               '0676974791',\n",
       "               '080410526X',\n",
       "               '1552783081',\n",
       "               '0446350982',\n",
       "               '038079487X',\n",
       "               '0385505833',\n",
       "               '0676972152',\n",
       "               '0786867647',\n",
       "               '0060959037',\n",
       "               '0771099894',\n",
       "               '0812550706',\n",
       "               '0425122123',\n",
       "               '0446667900',\n",
       "               '0671011375',\n",
       "               '1550541129'],\n",
       "              1: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              2: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              3: ['0060915544',\n",
       "               '0140042393',\n",
       "               '0552137030',\n",
       "               '0836220889',\n",
       "               '0425105334',\n",
       "               '0836218256',\n",
       "               '0140277439',\n",
       "               '0345338588',\n",
       "               '1853260002',\n",
       "               '0060935464',\n",
       "               '0836218353',\n",
       "               '0671868691',\n",
       "               '0446532231',\n",
       "               '038542017X',\n",
       "               '0440224764',\n",
       "               '0770422578',\n",
       "               '0006485278',\n",
       "               '0451163524',\n",
       "               '0771060548',\n",
       "               '0553287893'],\n",
       "              4: ['0380718839',\n",
       "               '0316666343',\n",
       "               '0345370775',\n",
       "               '0684872153',\n",
       "               '0671758896',\n",
       "               '0676974805',\n",
       "               '0440213525',\n",
       "               '0515111279',\n",
       "               '034540288X',\n",
       "               '0676973094',\n",
       "               '0671027360',\n",
       "               '0684874350',\n",
       "               '1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344'],\n",
       "              5: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558']},\n",
       "             'france': {0: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              1: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              2: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              3: ['2070370003',\n",
       "               '2070408507',\n",
       "               '2253140872',\n",
       "               '2266084372',\n",
       "               '2877302202',\n",
       "               '22530152730',\n",
       "               '2070744833',\n",
       "               '2253072079',\n",
       "               '2277260029',\n",
       "               '2290302155',\n",
       "               '2070363317',\n",
       "               '2253153265',\n",
       "               '2253144452',\n",
       "               '2264016124',\n",
       "               '2226135022',\n",
       "               '2020306492',\n",
       "               '2253154393',\n",
       "               '2290308285',\n",
       "               '2253150711',\n",
       "               '229030039X'],\n",
       "              4: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              5: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558']},\n",
       "             'germany': {0: ['3518366823',\n",
       "               '3423072571',\n",
       "               '3518368540',\n",
       "               '3423203668',\n",
       "               '3426029553',\n",
       "               '3453007867',\n",
       "               '3404148665',\n",
       "               '1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481'],\n",
       "              1: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              2: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              3: ['3551551936',\n",
       "               '3551551693',\n",
       "               '3551551677',\n",
       "               '3423071516',\n",
       "               '3518372742',\n",
       "               '3257230478',\n",
       "               '3442727952',\n",
       "               '3442724686',\n",
       "               '3518100734',\n",
       "               '3596215226',\n",
       "               '3150000017',\n",
       "               '3426612704',\n",
       "               '3423205202',\n",
       "               '3499224615',\n",
       "               '3423202947',\n",
       "               '3442442354',\n",
       "               '3453071174',\n",
       "               '3551551685',\n",
       "               '3423204206',\n",
       "               '3518388762'],\n",
       "              4: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              5: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558']},\n",
       "             'italy': {0: ['8806142100',\n",
       "               '8826703132',\n",
       "               '884590184X',\n",
       "               '8817131628',\n",
       "               '1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379'],\n",
       "              2: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              3: ['8845205118',\n",
       "               '8807813823',\n",
       "               '8845915700',\n",
       "               '8817106259',\n",
       "               '8807701510',\n",
       "               '8807816067',\n",
       "               '881786983X',\n",
       "               '0743222229',\n",
       "               '8807817039',\n",
       "               '8807814684',\n",
       "               '8806161741',\n",
       "               '884541096X',\n",
       "               '8845290077',\n",
       "               '8817106100',\n",
       "               '0451164075',\n",
       "               '8807816059',\n",
       "               '8804342838',\n",
       "               '9770390107900',\n",
       "               '1844262553',\n",
       "               '0439139597'],\n",
       "              4: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              5: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558']},\n",
       "             'n/a': {0: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              3: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              4: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558']},\n",
       "             'other': {0: ['8826703132',\n",
       "               '0060008024',\n",
       "               '0439064872',\n",
       "               '1558743669',\n",
       "               '0440211727',\n",
       "               '0330332775',\n",
       "               '0140298479',\n",
       "               '0380789019',\n",
       "               '034536676X',\n",
       "               '0446679593',\n",
       "               '0316693251',\n",
       "               '0316693006',\n",
       "               '1400034779',\n",
       "               '0345337662',\n",
       "               '0375706771',\n",
       "               '0385335881',\n",
       "               '0345339681',\n",
       "               '0553296981',\n",
       "               '044651652X',\n",
       "               '0062502182'],\n",
       "              1: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              2: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              3: ['0553296981',\n",
       "               '0441001971',\n",
       "               '0590353403',\n",
       "               '0671793489',\n",
       "               '0553213148',\n",
       "               '0515131229',\n",
       "               '0446310786',\n",
       "               '0439139597',\n",
       "               '0345378490',\n",
       "               '0747546290',\n",
       "               '0842329218',\n",
       "               '0312924585',\n",
       "               '3257228007',\n",
       "               '0786868716',\n",
       "               '051513628X',\n",
       "               '0151008116',\n",
       "               '0061092177',\n",
       "               '0375702709',\n",
       "               '0099800403',\n",
       "               '0439136350'],\n",
       "              4: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              5: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558']},\n",
       "             'portugal': {0: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              1: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              2: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              3: ['038082101X',\n",
       "               '0439139600',\n",
       "               '0380815923',\n",
       "               '006050918X',\n",
       "               '9505156944',\n",
       "               '0380977788',\n",
       "               '002542730X',\n",
       "               '0460877305',\n",
       "               '0385721234',\n",
       "               '0385413041',\n",
       "               '9726081378',\n",
       "               '0811214982',\n",
       "               '0330262130',\n",
       "               '0880381744',\n",
       "               '0552137030',\n",
       "               '9722113747',\n",
       "               '9580464162',\n",
       "               '9724614565',\n",
       "               '1401201385',\n",
       "               '1844262553'],\n",
       "              4: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              5: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558']},\n",
       "             'spain': {0: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              1: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              2: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              3: ['8445071416',\n",
       "               '8420616893',\n",
       "               '8420613487',\n",
       "               '950491036X',\n",
       "               '8478886508',\n",
       "               '8478886451',\n",
       "               '0156013924',\n",
       "               '8408039369',\n",
       "               '8420636282',\n",
       "               '8495501074',\n",
       "               '8420432113',\n",
       "               '8440627203',\n",
       "               '8445071408',\n",
       "               '0452282152',\n",
       "               '9681501225',\n",
       "               '8445071769',\n",
       "               '8420466034',\n",
       "               '8445071394',\n",
       "               '8423309223',\n",
       "               '8433914545'],\n",
       "              4: ['8408043641',\n",
       "               '1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605'],\n",
       "              5: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558']},\n",
       "             'united kingdom': {0: ['0590660543',\n",
       "               '000649840X',\n",
       "               '0330367358',\n",
       "               '0330376519',\n",
       "               '1857027051',\n",
       "               '0749395990',\n",
       "               '0552124753',\n",
       "               '0099771519',\n",
       "               '0749399902',\n",
       "               '1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207'],\n",
       "              1: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              2: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558'],\n",
       "              3: ['1844262553',\n",
       "               '0091891965',\n",
       "               '0140620117',\n",
       "               '0330258648',\n",
       "               '1860465811',\n",
       "               '1857231384',\n",
       "               '0552145424',\n",
       "               '0440206154',\n",
       "               '0552131059',\n",
       "               '0192833596',\n",
       "               '0440235596',\n",
       "               '0552142379',\n",
       "               '0330267388',\n",
       "               '0671024337',\n",
       "               '0380002930',\n",
       "               '0722532938',\n",
       "               '0552149519',\n",
       "               '0140287248',\n",
       "               '0380813815',\n",
       "               '0064407667'],\n",
       "              4: ['1844262553',\n",
       "               '0552147680',\n",
       "               '0552131067',\n",
       "               '0552996181',\n",
       "               '1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379'],\n",
       "              5: ['1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981',\n",
       "               '0670894605',\n",
       "               '0811825558']},\n",
       "             'usa': {0: ['0156004801',\n",
       "               '0060256672',\n",
       "               '0971942315',\n",
       "               '1576738167',\n",
       "               '0553351397',\n",
       "               '0441002935',\n",
       "               '0615116426',\n",
       "               '0316735027',\n",
       "               '0140309578',\n",
       "               '0140185232',\n",
       "               '0553148001',\n",
       "               '0395977894',\n",
       "               '0743455967',\n",
       "               '0618002235',\n",
       "               '039480029X',\n",
       "               '0877738513',\n",
       "               '0060248025',\n",
       "               '0807083054',\n",
       "               '0553380958',\n",
       "               '0553213504'],\n",
       "              1: ['0064407667',\n",
       "               '0439064872',\n",
       "               '059035342X',\n",
       "               '1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706'],\n",
       "              2: ['0590353403',\n",
       "               '0440237688',\n",
       "               '0451191137',\n",
       "               '0439139597',\n",
       "               '0679886370',\n",
       "               '0140348107',\n",
       "               '0064472272',\n",
       "               '0439064864',\n",
       "               '0671027344',\n",
       "               '0446608955',\n",
       "               '0394820371',\n",
       "               '0385729332',\n",
       "               '0316666343',\n",
       "               '0385729340',\n",
       "               '0385730586',\n",
       "               '043935806X',\n",
       "               '0439136350',\n",
       "               '1576738159',\n",
       "               '0440439884',\n",
       "               '0345342968'],\n",
       "              3: ['0066238501',\n",
       "               '0517693119',\n",
       "               '0394800389',\n",
       "               '0920668364',\n",
       "               '0395177111',\n",
       "               '0890876789',\n",
       "               '0898159954',\n",
       "               '0316286850',\n",
       "               '0375503803',\n",
       "               '0316779059',\n",
       "               '156402976X',\n",
       "               '0553110845',\n",
       "               '0060256737',\n",
       "               '0060968966',\n",
       "               '0670451932',\n",
       "               '0805013407',\n",
       "               '0060961325',\n",
       "               '0140195831',\n",
       "               '0451525663',\n",
       "               '0451171926'],\n",
       "              4: ['0312303467',\n",
       "               '0060514957',\n",
       "               '0553377868',\n",
       "               '0688167888',\n",
       "               '0399151451',\n",
       "               '1579546463',\n",
       "               '0380977311',\n",
       "               '0553379615',\n",
       "               '0943233828',\n",
       "               '0446532452',\n",
       "               '0553565079',\n",
       "               '0066214769',\n",
       "               '0446322180',\n",
       "               '0439064864',\n",
       "               '0399151613',\n",
       "               '0449911519',\n",
       "               '0451169514',\n",
       "               '0553802461',\n",
       "               '0312983220',\n",
       "               '0312983301'],\n",
       "              5: ['0440234743',\n",
       "               '044022165X',\n",
       "               '1844262553',\n",
       "               '0439139597',\n",
       "               '0439136350',\n",
       "               '0439064864',\n",
       "               '0877017883',\n",
       "               '0618002227',\n",
       "               '0590353403',\n",
       "               '0671027344',\n",
       "               '0385199570',\n",
       "               '0771060548',\n",
       "               '0156528207',\n",
       "               '0618129022',\n",
       "               '0552128481',\n",
       "               '0552131059',\n",
       "               '0811801802',\n",
       "               '0670032379',\n",
       "               '0812550706',\n",
       "               '0375756981']}})"
      ]
     },
     "execution_count": 135,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "feature_recommand = cPickle.load(open('./data/feature_recommand.pkl','rb'))\n",
    "feature_recommand"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 导入测试集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 136,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>user_id</th>\n",
       "      <th>location</th>\n",
       "      <th>age</th>\n",
       "      <th>item_id</th>\n",
       "      <th>rating</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>109814</th>\n",
       "      <td>27462</td>\n",
       "      <td>usa</td>\n",
       "      <td>0</td>\n",
       "      <td>1587492695</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>561359</th>\n",
       "      <td>137190</td>\n",
       "      <td>france</td>\n",
       "      <td>3</td>\n",
       "      <td>0552997234</td>\n",
       "      <td>8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>182843</th>\n",
       "      <td>42721</td>\n",
       "      <td>canada</td>\n",
       "      <td>3</td>\n",
       "      <td>0671024108</td>\n",
       "      <td>8</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>854047</th>\n",
       "      <td>208829</td>\n",
       "      <td>canada</td>\n",
       "      <td>0</td>\n",
       "      <td>0140503897</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>559003</th>\n",
       "      <td>136348</td>\n",
       "      <td>usa</td>\n",
       "      <td>4</td>\n",
       "      <td>0807220299</td>\n",
       "      <td>9</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        user_id location  age     item_id  rating\n",
       "109814    27462      usa    0  1587492695       0\n",
       "561359   137190   france    3  0552997234       8\n",
       "182843    42721   canada    3  0671024108       8\n",
       "854047   208829   canada    0  0140503897       0\n",
       "559003   136348      usa    4  0807220299       9"
      ]
     },
     "execution_count": 136,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_data_text = cPickle.load(open('./data/df_data_text.pkl','rb'))\n",
    "df_data_text.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 处理location"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 140,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['australia',\n",
       " 'canada',\n",
       " 'france',\n",
       " 'germany',\n",
       " 'italy',\n",
       " 'n/a',\n",
       " 'other',\n",
       " 'portugal',\n",
       " 'spain',\n",
       " 'united kingdom',\n",
       " 'usa']"
      ]
     },
     "execution_count": 140,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "top_location_s = list(feature_recommand.keys())\n",
    "top_location_s"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 141,
   "metadata": {},
   "outputs": [],
   "source": [
    "df_data_text['location'] = df_data_text['location'].apply(lambda location : location if location in top_location_s else 'other')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 142,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "usa               230427\n",
       "canada             31331\n",
       "other              25235\n",
       "united kingdom     15239\n",
       "germany            11986\n",
       "australia           7873\n",
       "spain               7792\n",
       "france              4142\n",
       "n/a                 4097\n",
       "italy               3665\n",
       "portugal            3144\n",
       "Name: location, dtype: int64"
      ]
     },
     "execution_count": 142,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_data_text['location'].value_counts()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 得到准确率和召回率"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 143,
   "metadata": {},
   "outputs": [],
   "source": [
    "union_quantity = 0\n",
    "recommand_quantity = 0\n",
    "user_fav_quantity = 0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 144,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "执行到： australia 0\n",
      "执行到： australia 1\n",
      "执行到： australia 2\n",
      "执行到： australia 3\n",
      "执行到： australia 4\n",
      "执行到： australia 5\n",
      "执行到： canada 0\n",
      "执行到： canada 1\n",
      "执行到： canada 2\n",
      "执行到： canada 3\n",
      "执行到： canada 4\n",
      "执行到： canada 5\n",
      "执行到： france 0\n",
      "执行到： france 2\n",
      "执行到： france 3\n",
      "执行到： france 4\n",
      "执行到： france 5\n",
      "执行到： germany 0\n",
      "执行到： germany 1\n",
      "执行到： germany 2\n",
      "执行到： germany 3\n",
      "执行到： germany 4\n",
      "执行到： germany 5\n",
      "执行到： italy 0\n",
      "执行到： italy 2\n",
      "执行到： italy 3\n",
      "执行到： italy 4\n",
      "执行到： n/a 0\n",
      "执行到： other 0\n",
      "执行到： other 1\n",
      "执行到： other 2\n",
      "执行到： other 3\n",
      "执行到： other 4\n",
      "执行到： other 5\n",
      "执行到： portugal 0\n",
      "执行到： portugal 2\n",
      "执行到： portugal 3\n",
      "执行到： portugal 4\n",
      "执行到： portugal 5\n",
      "执行到： spain 0\n",
      "执行到： spain 2\n",
      "执行到： spain 3\n",
      "执行到： spain 4\n",
      "执行到： spain 5\n",
      "执行到： united kingdom 0\n",
      "执行到： united kingdom 1\n",
      "执行到： united kingdom 2\n",
      "执行到： united kingdom 3\n",
      "执行到： united kingdom 4\n",
      "执行到： united kingdom 5\n",
      "执行到： usa 0\n",
      "执行到： usa 1\n",
      "执行到： usa 2\n",
      "执行到： usa 3\n",
      "执行到： usa 4\n",
      "执行到： usa 5\n",
      "准确率: 0.0003815577305283684\n",
      "召回率: 0.0032691288213465277\n"
     ]
    }
   ],
   "source": [
    "for location,groupby_location in df_data_text.groupby('location'):\n",
    "    for age,groupby_location_age in groupby_location.groupby('age'):\n",
    "        print('执行到：',location,age)\n",
    "        for user_id,groupby_location_age_userid in groupby_location_age.groupby('user_id'):\n",
    "            items_rating = groupby_location_age_userid.groupby('item_id')['rating'].mean().sort_values(ascending=False)\n",
    "            user_fav_items = [\n",
    "                item_id\n",
    "                for item_id in items_rating.index if items_rating[item_id] >= 5\n",
    "            ]\n",
    "            recommand_items = feature_recommand[location][age]\n",
    "            union_quantity += len(\n",
    "                set(user_fav_items) & set(recommand_items)\n",
    "            )\n",
    "            recommand_quantity += len(recommand_items)\n",
    "            user_fav_quantity += len(user_fav_items)\n",
    "print('准确率:',union_quantity / recommand_quantity)\n",
    "print('召回率:',union_quantity / user_fav_quantity)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
